css_ast/types/
position_area.rs

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