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