1use super::prelude::*;
2
3#[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}