Skip to main content

css_ast/functions/
snap_inline_function.rs

1use super::prelude::*;
2use crate::{CalcableValue, 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#[node]
10#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
11#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
12#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
13#[derive(csskit_derives::NodeWithMetadata)]
14pub struct SnapInlineFunction<'a> {
15	#[atom(CssAtomSet::SnapInline)]
16	pub name: T![Function],
17	pub params: SnapInlineFunctionParams<'a>,
18	#[semantic_eq(skip)]
19	pub close: T![')'],
20}
21
22#[node]
23#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
24#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
25#[derive(csskit_derives::NodeWithMetadata)]
26pub struct SnapInlineFunctionParams<'a>(
27	CalcableValue<'a, LengthPercentage>,
28	#[semantic_eq(skip)] Option<T![,]>,
29	Option<SnapInlineKeyword>,
30	#[semantic_eq(skip)] Option<T![,]>,
31);
32
33#[node]
34#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, 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(skip))]
37#[derive(csskit_derives::NodeWithMetadata)]
38pub enum SnapInlineKeyword {
39	#[atom(CssAtomSet::Left)]
40	Left(T![Ident]),
41	#[atom(CssAtomSet::Right)]
42	Right(T![Ident]),
43	#[atom(CssAtomSet::Near)]
44	Near(T![Ident]),
45}
46
47#[cfg(test)]
48mod tests {
49	use super::*;
50	use crate::CssAtomSet;
51	use css_parse::{assert_parse, assert_parse_error, assert_peek_false};
52
53	#[test]
54	fn test_writes() {
55		assert_parse!(CssAtomSet::ATOMS, SnapInlineFunction, "snap-inline(10%)");
56		assert_parse!(CssAtomSet::ATOMS, SnapInlineFunction, "snap-inline(10%,near)");
57	}
58
59	#[test]
60	fn test_substitution() {
61		assert_parse!(CssAtomSet::ATOMS, SnapInlineFunction, "snap-inline(calc(1px + 2%))");
62		assert_parse!(CssAtomSet::ATOMS, SnapInlineFunction, "snap-inline(var(--x))");
63	}
64
65	#[test]
66	fn test_errors() {
67		assert_peek_false!(CssAtomSet::ATOMS, SnapInlineFunction, "snap-block(10%)");
68		assert_parse_error!(CssAtomSet::ATOMS, SnapInlineFunction, "snap-inline(near)");
69	}
70}