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