css_ast/functions/
snap_inline_function.rs

1use super::prelude::*;
2use crate::units::LengthPercentage;
3
4/// <https://drafts.csswg.org/css-page-floats-3/#funcdef-float-snap-inline>
5///
6/// ```text,ignore
7/// snap-inline() = snap-inline( <length> , [ left | right | near ]? )
8/// ```
9#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
11#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
12#[derive(csskit_derives::NodeWithMetadata)]
13pub struct SnapInlineFunction {
14	#[atom(CssAtomSet::SnapInline)]
15	pub name: T![Function],
16	pub params: SnapInlineFunctionParams,
17	pub close: T![')'],
18}
19
20#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
21#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
22pub struct SnapInlineFunctionParams(LengthPercentage, Option<T![,]>, Option<SnapInlineKeyword>, Option<T![,]>);
23
24#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
25#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
26#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(skip))]
27#[derive(csskit_derives::NodeWithMetadata)]
28pub enum SnapInlineKeyword {
29	#[atom(CssAtomSet::Left)]
30	Left(T![Ident]),
31	#[atom(CssAtomSet::Right)]
32	Right(T![Ident]),
33	#[atom(CssAtomSet::Near)]
34	Near(T![Ident]),
35}
36
37#[cfg(test)]
38mod tests {
39	use super::*;
40	use crate::CssAtomSet;
41	use css_parse::{assert_parse, assert_parse_error};
42
43	#[test]
44	fn size_test() {
45		assert_eq!(std::mem::size_of::<SnapInlineFunction>(), 88);
46	}
47
48	#[test]
49	fn test_writes() {
50		assert_parse!(CssAtomSet::ATOMS, SnapInlineFunction, "snap-inline(10%)");
51		assert_parse!(CssAtomSet::ATOMS, SnapInlineFunction, "snap-inline(10%,near)");
52	}
53
54	#[test]
55	fn test_errors() {
56		assert_parse_error!(CssAtomSet::ATOMS, SnapInlineFunction, "snap-block(10%)");
57		assert_parse_error!(CssAtomSet::ATOMS, SnapInlineFunction, "snap-inline(near)");
58	}
59}