Skip to main content

css_ast/types/
position_area.rs

1use super::prelude::*;
2
3/// <https://drafts.csswg.org/css-anchor-position-1/#typedef-position-area>
4///
5/// ```text,ignore
6/// <position-area> = [
7///   [ left | center | right | span-left | span-right
8///   | x-start | x-end | span-x-start | span-x-end
9///   | x-self-start | x-self-end | span-x-self-start | span-x-self-end
10///   | span-all ]
11///   ||
12///   [ top | center | bottom | span-top | span-bottom
13///   | y-start | y-end | span-y-start | span-y-end
14///   | y-self-start | y-self-end | span-y-self-start | span-y-self-end
15///   | span-all ]
16/// |
17///   [ block-start | center | block-end | span-block-start | span-block-end | span-all ]
18///   ||
19///   [ inline-start | center | inline-end | span-inline-start | span-inline-end
20///   | span-all ]
21/// |
22///   [ self-block-start | center | self-block-end | span-self-block-start
23///   | span-self-block-end | span-all ]
24///   ||
25///   [ self-inline-start | center | self-inline-end | span-self-inline-start
26///   | span-self-inline-end | span-all ]
27/// |
28///   [ start | center | end | span-start | span-end | span-all ]{1,2}
29/// |
30///   [ self-start | center | self-end | span-self-start | span-self-end | span-all ]{1,2}
31/// ]
32/// ```
33#[derive(ToCursors, ToSpan, SemanticEq, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
34#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
35#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
36#[derive(csskit_derives::NodeWithMetadata)]
37pub enum PositionArea {
38	Physical(Option<PositionAreaPhsyicalHorizontal>, Option<PositionAreaPhsyicalVertical>),
39	Logical(Option<PositionAreaBlock>, Option<PositionAreaInline>),
40	SelfLogical(Option<PositionAreaSelfBlock>, Option<PositionAreaSelfInline>),
41	Position(PositionAreaPosition, Option<PositionAreaPosition>),
42	SelfPosition(PositionAreaSelfPosition, Option<PositionAreaSelfPosition>),
43}
44
45impl<'a> Peek<'a> for PositionArea {
46	fn peek<I>(p: &Parser<'a, I>, c: Cursor) -> bool
47	where
48		I: Iterator<Item = Cursor> + Clone,
49	{
50		PositionAreaPhsyicalVertical::peek(p, c)
51			|| PositionAreaPhsyicalHorizontal::peek(p, c)
52			|| PositionAreaBlock::peek(p, c)
53			|| PositionAreaInline::peek(p, c)
54			|| PositionAreaSelfBlock::peek(p, c)
55			|| PositionAreaSelfInline::peek(p, c)
56			|| PositionAreaPosition::peek(p, c)
57			|| PositionAreaSelfPosition::peek(p, c)
58	}
59}
60
61impl<'a> Parse<'a> for PositionArea {
62	fn parse<I>(p: &mut Parser<'a, I>) -> ParserResult<Self>
63	where
64		I: Iterator<Item = Cursor> + Clone,
65	{
66		if let Some(first) = p.parse_if_peek::<PositionAreaPosition>()? {
67			Ok(Self::Position(first, p.parse_if_peek::<PositionAreaPosition>()?))
68		} else if let Some(first) = p.parse_if_peek::<PositionAreaSelfPosition>()? {
69			Ok(Self::SelfPosition(first, p.parse_if_peek::<PositionAreaSelfPosition>()?))
70		} else if let Some(block) = p.parse_if_peek::<PositionAreaBlock>()? {
71			Ok(Self::Logical(Some(block), p.parse_if_peek::<PositionAreaInline>()?))
72		} else if let Some(inline) = p.parse_if_peek::<PositionAreaInline>()? {
73			Ok(Self::Logical(p.parse_if_peek::<PositionAreaBlock>()?, Some(inline)))
74		} else if let Some(block) = p.parse_if_peek::<PositionAreaSelfBlock>()? {
75			Ok(Self::SelfLogical(Some(block), p.parse_if_peek::<PositionAreaSelfInline>()?))
76		} else if let Some(inline) = p.parse_if_peek::<PositionAreaSelfInline>()? {
77			Ok(Self::SelfLogical(p.parse_if_peek::<PositionAreaSelfBlock>()?, Some(inline)))
78		} else if let Some(horizontal) = p.parse_if_peek::<PositionAreaPhsyicalHorizontal>()? {
79			Ok(Self::Physical(Some(horizontal), p.parse_if_peek::<PositionAreaPhsyicalVertical>()?))
80		} else if let Some(vertical) = p.parse_if_peek::<PositionAreaPhsyicalVertical>()? {
81			Ok(Self::Physical(p.parse_if_peek::<PositionAreaPhsyicalHorizontal>()?, Some(vertical)))
82		} else {
83			Err(Diagnostic::new(p.next(), Diagnostic::unexpected))?
84		}
85	}
86}
87
88#[derive(Parse, Peek, IntoCursor, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
89#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
90pub enum PositionAreaPhsyicalHorizontal {
91	#[atom(CssAtomSet::Left)]
92	Left(T![Ident]),
93	#[atom(CssAtomSet::Center)]
94	Center(T![Ident]),
95	#[atom(CssAtomSet::Right)]
96	Right(T![Ident]),
97	#[atom(CssAtomSet::SpanLeft)]
98	SpanLeft(T![Ident]),
99	#[atom(CssAtomSet::SpanRight)]
100	SpanRight(T![Ident]),
101	#[atom(CssAtomSet::XStart)]
102	XStart(T![Ident]),
103	#[atom(CssAtomSet::XEnd)]
104	XEnd(T![Ident]),
105	#[atom(CssAtomSet::SpanXStart)]
106	SpanXStart(T![Ident]),
107	#[atom(CssAtomSet::SpanXEnd)]
108	SpanXEnd(T![Ident]),
109	#[atom(CssAtomSet::XSelfStart)]
110	XSelfStart(T![Ident]),
111	#[atom(CssAtomSet::XSelfEnd)]
112	XSelfEnd(T![Ident]),
113	#[atom(CssAtomSet::SpanXSelfStart)]
114	SpanXSelfStart(T![Ident]),
115	#[atom(CssAtomSet::SpanXSelfEnd)]
116	SpanXSelfEnd(T![Ident]),
117	#[atom(CssAtomSet::SpanAll)]
118	SpanAll(T![Ident]),
119}
120
121#[derive(Parse, Peek, IntoCursor, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
122#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
123pub enum PositionAreaPhsyicalVertical {
124	#[atom(CssAtomSet::Top)]
125	Top(T![Ident]),
126	#[atom(CssAtomSet::Center)]
127	Center(T![Ident]),
128	#[atom(CssAtomSet::Bottom)]
129	Bottom(T![Ident]),
130	#[atom(CssAtomSet::SpanTop)]
131	SpanTop(T![Ident]),
132	#[atom(CssAtomSet::SpanBottom)]
133	SpanBottom(T![Ident]),
134	#[atom(CssAtomSet::YStart)]
135	YStart(T![Ident]),
136	#[atom(CssAtomSet::YEnd)]
137	YEnd(T![Ident]),
138	#[atom(CssAtomSet::SpanYStart)]
139	SpanYStart(T![Ident]),
140	#[atom(CssAtomSet::SpanYEnd)]
141	SpanYEnd(T![Ident]),
142	#[atom(CssAtomSet::YSelfStart)]
143	YSelfStart(T![Ident]),
144	#[atom(CssAtomSet::YSelfEnd)]
145	YSelfEnd(T![Ident]),
146	#[atom(CssAtomSet::SpanYSelfStart)]
147	SpanYSelfStart(T![Ident]),
148	#[atom(CssAtomSet::SpanYSelfEnd)]
149	SpanYSelfEnd(T![Ident]),
150	#[atom(CssAtomSet::SpanAll)]
151	SpanAll(T![Ident]),
152}
153
154#[derive(Parse, Peek, IntoCursor, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
155#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
156pub enum PositionAreaBlock {
157	#[atom(CssAtomSet::BlockStart)]
158	BlockStart(T![Ident]),
159	#[atom(CssAtomSet::Center)]
160	Center(T![Ident]),
161	#[atom(CssAtomSet::BlockEnd)]
162	BlockEnd(T![Ident]),
163	#[atom(CssAtomSet::SpanBlockStart)]
164	SpanBlockStart(T![Ident]),
165	#[atom(CssAtomSet::SpanBlockEnd)]
166	SpanBlockEnd(T![Ident]),
167	#[atom(CssAtomSet::SpanAll)]
168	SpanAll(T![Ident]),
169}
170
171#[derive(Parse, Peek, IntoCursor, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
172#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
173pub enum PositionAreaInline {
174	#[atom(CssAtomSet::InlineStart)]
175	InlineStart(T![Ident]),
176	#[atom(CssAtomSet::Center)]
177	Center(T![Ident]),
178	#[atom(CssAtomSet::InlineEnd)]
179	InlineEnd(T![Ident]),
180	#[atom(CssAtomSet::SpanInlineStart)]
181	SpanInlineStart(T![Ident]),
182	#[atom(CssAtomSet::SpanInlineEnd)]
183	SpanInlineEnd(T![Ident]),
184	#[atom(CssAtomSet::SpanAll)]
185	SpanAll(T![Ident]),
186}
187
188#[derive(Parse, Peek, IntoCursor, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
189#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
190pub enum PositionAreaSelfBlock {
191	#[atom(CssAtomSet::SelfBlockStart)]
192	SelfBlockStart(T![Ident]),
193	#[atom(CssAtomSet::Center)]
194	Center(T![Ident]),
195	#[atom(CssAtomSet::SelfBlockEnd)]
196	SelfBlockEnd(T![Ident]),
197	#[atom(CssAtomSet::SpanSelfBlockStart)]
198	SpanSelfBlockStart(T![Ident]),
199	#[atom(CssAtomSet::SpanSelfBlockEnd)]
200	SpanSelfBlockEnd(T![Ident]),
201	#[atom(CssAtomSet::SpanAll)]
202	SpanAll(T![Ident]),
203}
204
205#[derive(Parse, Peek, IntoCursor, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
206#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
207pub enum PositionAreaSelfInline {
208	#[atom(CssAtomSet::SelfInlineStart)]
209	SelfInlineStart(T![Ident]),
210	#[atom(CssAtomSet::Center)]
211	Center(T![Ident]),
212	#[atom(CssAtomSet::SelfInlineEnd)]
213	SelfInlineEnd(T![Ident]),
214	#[atom(CssAtomSet::SpanSelfInlineStart)]
215	SpanSelfInlineStart(T![Ident]),
216	#[atom(CssAtomSet::SpanSelfInlineEnd)]
217	SpanSelfInlineEnd(T![Ident]),
218	#[atom(CssAtomSet::SpanAll)]
219	SpanAll(T![Ident]),
220}
221
222#[derive(Parse, Peek, IntoCursor, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
223#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
224pub enum PositionAreaPosition {
225	#[atom(CssAtomSet::Start)]
226	Start(T![Ident]),
227	#[atom(CssAtomSet::Center)]
228	Center(T![Ident]),
229	#[atom(CssAtomSet::End)]
230	End(T![Ident]),
231	#[atom(CssAtomSet::SpanStart)]
232	SpanStart(T![Ident]),
233	#[atom(CssAtomSet::SpanEnd)]
234	SpanEnd(T![Ident]),
235	#[atom(CssAtomSet::SpanAll)]
236	SpanAll(T![Ident]),
237}
238
239#[derive(Parse, Peek, IntoCursor, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
240#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
241pub enum PositionAreaSelfPosition {
242	#[atom(CssAtomSet::SelfStart)]
243	SelfStart(T![Ident]),
244	#[atom(CssAtomSet::Center)]
245	Center(T![Ident]),
246	#[atom(CssAtomSet::SelfEnd)]
247	SelfEnd(T![Ident]),
248	#[atom(CssAtomSet::SpanSelfStart)]
249	SpanSelfStart(T![Ident]),
250	#[atom(CssAtomSet::SpanSelfEnd)]
251	SpanSelfEnd(T![Ident]),
252	#[atom(CssAtomSet::SpanAll)]
253	SpanAll(T![Ident]),
254}