css_ast/functions/
snap_inline_function.rs1use super::prelude::*;
2use crate::{CalcableValue, units::LengthPercentage};
3
4#[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}