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#[node]
34#[derive(ToCursors, ToSpan, SemanticEq, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
35#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
36#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
37#[derive(csskit_derives::NodeWithMetadata)]
38pub enum PositionArea {
39	Physical(Option<PositionAreaPhsyicalHorizontal>, Option<PositionAreaPhsyicalVertical>),
40	Logical(Option<PositionAreaBlock>, Option<PositionAreaInline>),
41	SelfLogical(Option<PositionAreaSelfBlock>, Option<PositionAreaSelfInline>),
42	Position(PositionAreaPosition, Option<PositionAreaPosition>),
43	SelfPosition(PositionAreaSelfPosition, Option<PositionAreaSelfPosition>),
44}
45
46impl<'a> Peek<'a> for PositionArea {
47	const PEEK_KINDSET: KindSet = PositionAreaPhsyicalVertical::PEEK_KINDSET
48		.combine(PositionAreaPhsyicalHorizontal::PEEK_KINDSET)
49		.combine(PositionAreaBlock::PEEK_KINDSET)
50		.combine(PositionAreaInline::PEEK_KINDSET)
51		.combine(PositionAreaSelfBlock::PEEK_KINDSET)
52		.combine(PositionAreaSelfInline::PEEK_KINDSET)
53		.combine(PositionAreaPosition::PEEK_KINDSET)
54		.combine(PositionAreaSelfPosition::PEEK_KINDSET);
55
56	#[inline(always)]
57	fn peek<I>(p: &Parser<'a, I>, c: Cursor) -> bool
58	where
59		I: Iterator<Item = Cursor> + Clone,
60	{
61		PositionAreaPhsyicalVertical::peek(p, c)
62			|| PositionAreaPhsyicalHorizontal::peek(p, c)
63			|| PositionAreaBlock::peek(p, c)
64			|| PositionAreaInline::peek(p, c)
65			|| PositionAreaSelfBlock::peek(p, c)
66			|| PositionAreaSelfInline::peek(p, c)
67			|| PositionAreaPosition::peek(p, c)
68			|| PositionAreaSelfPosition::peek(p, c)
69	}
70}
71
72impl<'a> Parse<'a> for PositionArea {
73	fn parse<I>(p: &mut Parser<'a, I>) -> ParserResult<Self>
74	where
75		I: Iterator<Item = Cursor> + Clone,
76	{
77		if let Some(first) = p.parse_if_peek::<PositionAreaPosition>()? {
78			Ok(Self::Position(first, p.parse_if_peek::<PositionAreaPosition>()?))
79		} else if let Some(first) = p.parse_if_peek::<PositionAreaSelfPosition>()? {
80			Ok(Self::SelfPosition(first, p.parse_if_peek::<PositionAreaSelfPosition>()?))
81		} else if let Some(block) = p.parse_if_peek::<PositionAreaBlock>()? {
82			Ok(Self::Logical(Some(block), p.parse_if_peek::<PositionAreaInline>()?))
83		} else if let Some(inline) = p.parse_if_peek::<PositionAreaInline>()? {
84			Ok(Self::Logical(p.parse_if_peek::<PositionAreaBlock>()?, Some(inline)))
85		} else if let Some(block) = p.parse_if_peek::<PositionAreaSelfBlock>()? {
86			Ok(Self::SelfLogical(Some(block), p.parse_if_peek::<PositionAreaSelfInline>()?))
87		} else if let Some(inline) = p.parse_if_peek::<PositionAreaSelfInline>()? {
88			Ok(Self::SelfLogical(p.parse_if_peek::<PositionAreaSelfBlock>()?, Some(inline)))
89		} else if let Some(horizontal) = p.parse_if_peek::<PositionAreaPhsyicalHorizontal>()? {
90			Ok(Self::Physical(Some(horizontal), p.parse_if_peek::<PositionAreaPhsyicalVertical>()?))
91		} else if let Some(vertical) = p.parse_if_peek::<PositionAreaPhsyicalVertical>()? {
92			Ok(Self::Physical(p.parse_if_peek::<PositionAreaPhsyicalHorizontal>()?, Some(vertical)))
93		} else {
94			Err(Diagnostic::new(p.next(), Diagnostic::unexpected))?
95		}
96	}
97}
98
99#[derive(
100	Parse, Peek, IntoCursor, ToSpan, SemanticEq, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash,
101)]
102#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
103#[derive(csskit_derives::NodeWithMetadata)]
104pub enum PositionAreaPhsyicalHorizontal {
105	#[atom(CssAtomSet::Left)]
106	Left(T![Ident]),
107	#[atom(CssAtomSet::Center)]
108	Center(T![Ident]),
109	#[atom(CssAtomSet::Right)]
110	Right(T![Ident]),
111	#[atom(CssAtomSet::SpanLeft)]
112	SpanLeft(T![Ident]),
113	#[atom(CssAtomSet::SpanRight)]
114	SpanRight(T![Ident]),
115	#[atom(CssAtomSet::XStart)]
116	XStart(T![Ident]),
117	#[atom(CssAtomSet::XEnd)]
118	XEnd(T![Ident]),
119	#[atom(CssAtomSet::SpanXStart)]
120	SpanXStart(T![Ident]),
121	#[atom(CssAtomSet::SpanXEnd)]
122	SpanXEnd(T![Ident]),
123	#[atom(CssAtomSet::XSelfStart)]
124	XSelfStart(T![Ident]),
125	#[atom(CssAtomSet::XSelfEnd)]
126	XSelfEnd(T![Ident]),
127	#[atom(CssAtomSet::SpanXSelfStart)]
128	SpanXSelfStart(T![Ident]),
129	#[atom(CssAtomSet::SpanXSelfEnd)]
130	SpanXSelfEnd(T![Ident]),
131	#[atom(CssAtomSet::SpanAll)]
132	SpanAll(T![Ident]),
133}
134
135#[derive(
136	Parse, Peek, IntoCursor, ToSpan, SemanticEq, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash,
137)]
138#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
139#[derive(csskit_derives::NodeWithMetadata)]
140pub enum PositionAreaPhsyicalVertical {
141	#[atom(CssAtomSet::Top)]
142	Top(T![Ident]),
143	#[atom(CssAtomSet::Center)]
144	Center(T![Ident]),
145	#[atom(CssAtomSet::Bottom)]
146	Bottom(T![Ident]),
147	#[atom(CssAtomSet::SpanTop)]
148	SpanTop(T![Ident]),
149	#[atom(CssAtomSet::SpanBottom)]
150	SpanBottom(T![Ident]),
151	#[atom(CssAtomSet::YStart)]
152	YStart(T![Ident]),
153	#[atom(CssAtomSet::YEnd)]
154	YEnd(T![Ident]),
155	#[atom(CssAtomSet::SpanYStart)]
156	SpanYStart(T![Ident]),
157	#[atom(CssAtomSet::SpanYEnd)]
158	SpanYEnd(T![Ident]),
159	#[atom(CssAtomSet::YSelfStart)]
160	YSelfStart(T![Ident]),
161	#[atom(CssAtomSet::YSelfEnd)]
162	YSelfEnd(T![Ident]),
163	#[atom(CssAtomSet::SpanYSelfStart)]
164	SpanYSelfStart(T![Ident]),
165	#[atom(CssAtomSet::SpanYSelfEnd)]
166	SpanYSelfEnd(T![Ident]),
167	#[atom(CssAtomSet::SpanAll)]
168	SpanAll(T![Ident]),
169}
170
171#[derive(
172	Parse, Peek, IntoCursor, ToSpan, SemanticEq, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash,
173)]
174#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
175#[derive(csskit_derives::NodeWithMetadata)]
176pub enum PositionAreaBlock {
177	#[atom(CssAtomSet::BlockStart)]
178	BlockStart(T![Ident]),
179	#[atom(CssAtomSet::Center)]
180	Center(T![Ident]),
181	#[atom(CssAtomSet::BlockEnd)]
182	BlockEnd(T![Ident]),
183	#[atom(CssAtomSet::SpanBlockStart)]
184	SpanBlockStart(T![Ident]),
185	#[atom(CssAtomSet::SpanBlockEnd)]
186	SpanBlockEnd(T![Ident]),
187	#[atom(CssAtomSet::SpanAll)]
188	SpanAll(T![Ident]),
189}
190
191#[derive(
192	Parse, Peek, IntoCursor, ToSpan, SemanticEq, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash,
193)]
194#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
195#[derive(csskit_derives::NodeWithMetadata)]
196pub enum PositionAreaInline {
197	#[atom(CssAtomSet::InlineStart)]
198	InlineStart(T![Ident]),
199	#[atom(CssAtomSet::Center)]
200	Center(T![Ident]),
201	#[atom(CssAtomSet::InlineEnd)]
202	InlineEnd(T![Ident]),
203	#[atom(CssAtomSet::SpanInlineStart)]
204	SpanInlineStart(T![Ident]),
205	#[atom(CssAtomSet::SpanInlineEnd)]
206	SpanInlineEnd(T![Ident]),
207	#[atom(CssAtomSet::SpanAll)]
208	SpanAll(T![Ident]),
209}
210
211#[derive(
212	Parse, Peek, IntoCursor, ToSpan, SemanticEq, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash,
213)]
214#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
215#[derive(csskit_derives::NodeWithMetadata)]
216pub enum PositionAreaSelfBlock {
217	#[atom(CssAtomSet::SelfBlockStart)]
218	SelfBlockStart(T![Ident]),
219	#[atom(CssAtomSet::Center)]
220	Center(T![Ident]),
221	#[atom(CssAtomSet::SelfBlockEnd)]
222	SelfBlockEnd(T![Ident]),
223	#[atom(CssAtomSet::SpanSelfBlockStart)]
224	SpanSelfBlockStart(T![Ident]),
225	#[atom(CssAtomSet::SpanSelfBlockEnd)]
226	SpanSelfBlockEnd(T![Ident]),
227	#[atom(CssAtomSet::SpanAll)]
228	SpanAll(T![Ident]),
229}
230
231#[derive(
232	Parse, Peek, IntoCursor, ToSpan, SemanticEq, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash,
233)]
234#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
235#[derive(csskit_derives::NodeWithMetadata)]
236pub enum PositionAreaSelfInline {
237	#[atom(CssAtomSet::SelfInlineStart)]
238	SelfInlineStart(T![Ident]),
239	#[atom(CssAtomSet::Center)]
240	Center(T![Ident]),
241	#[atom(CssAtomSet::SelfInlineEnd)]
242	SelfInlineEnd(T![Ident]),
243	#[atom(CssAtomSet::SpanSelfInlineStart)]
244	SpanSelfInlineStart(T![Ident]),
245	#[atom(CssAtomSet::SpanSelfInlineEnd)]
246	SpanSelfInlineEnd(T![Ident]),
247	#[atom(CssAtomSet::SpanAll)]
248	SpanAll(T![Ident]),
249}
250
251#[derive(
252	Parse, Peek, IntoCursor, ToSpan, SemanticEq, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash,
253)]
254#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
255#[derive(csskit_derives::NodeWithMetadata)]
256pub enum PositionAreaPosition {
257	#[atom(CssAtomSet::Start)]
258	Start(T![Ident]),
259	#[atom(CssAtomSet::Center)]
260	Center(T![Ident]),
261	#[atom(CssAtomSet::End)]
262	End(T![Ident]),
263	#[atom(CssAtomSet::SpanStart)]
264	SpanStart(T![Ident]),
265	#[atom(CssAtomSet::SpanEnd)]
266	SpanEnd(T![Ident]),
267	#[atom(CssAtomSet::SpanAll)]
268	SpanAll(T![Ident]),
269}
270
271#[derive(
272	Parse, Peek, IntoCursor, ToSpan, SemanticEq, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash,
273)]
274#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
275#[derive(csskit_derives::NodeWithMetadata)]
276pub enum PositionAreaSelfPosition {
277	#[atom(CssAtomSet::SelfStart)]
278	SelfStart(T![Ident]),
279	#[atom(CssAtomSet::Center)]
280	Center(T![Ident]),
281	#[atom(CssAtomSet::SelfEnd)]
282	SelfEnd(T![Ident]),
283	#[atom(CssAtomSet::SpanSelfStart)]
284	SpanSelfStart(T![Ident]),
285	#[atom(CssAtomSet::SpanSelfEnd)]
286	SpanSelfEnd(T![Ident]),
287	#[atom(CssAtomSet::SpanAll)]
288	SpanAll(T![Ident]),
289}