Skip to main content

css_ast/functions/
snap_block_function.rs

1use super::prelude::*;
2use crate::{CalcableValue, units::LengthPercentage};
3
4/// <https://drafts.csswg.org/css-page-floats-3/#funcdef-float-snap-block>
5///
6/// ```text,ignore
7/// snap-block() = snap-block( <length> , [ start | end | 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 SnapBlockFunction<'a> {
15	#[atom(CssAtomSet::SnapBlock)]
16	pub name: T![Function],
17	pub params: SnapBlockFunctionParams<'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 SnapBlockFunctionParams<'a>(
27	CalcableValue<'a, LengthPercentage>,
28	#[semantic_eq(skip)] Option<T![,]>,
29	Option<SnapBlockKeyword>,
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 SnapBlockKeyword {
39	#[atom(CssAtomSet::Start)]
40	Start(T![Ident]),
41	#[atom(CssAtomSet::End)]
42	End(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, SnapBlockFunction, "snap-block(10%)");
56		assert_parse!(CssAtomSet::ATOMS, SnapBlockFunction, "snap-block(10%,start)");
57	}
58
59	#[test]
60	fn test_substitution() {
61		assert_parse!(CssAtomSet::ATOMS, SnapBlockFunction, "snap-block(calc(1px + 2%))");
62		assert_parse!(CssAtomSet::ATOMS, SnapBlockFunction, "snap-block(var(--x))");
63	}
64
65	#[test]
66	fn test_errors() {
67		assert_peek_false!(CssAtomSet::ATOMS, SnapBlockFunction, "snap-inline(10%)");
68		assert_parse_error!(CssAtomSet::ATOMS, SnapBlockFunction, "snap-block(start)");
69	}
70}