1use super::prelude::*;
2use crate::{CustomIdent, Value};
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 StylisticFunction<'a> {
15 #[atom(CssAtomSet::Stylistic)]
16 pub name: T![Function],
17 pub params: Value<'a, CustomIdent>,
18 #[semantic_eq(skip)]
19 pub close: T![')'],
20}
21
22#[node]
28#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
29#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
30#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
31#[derive(csskit_derives::NodeWithMetadata)]
32pub struct StylesetFunction<'a> {
33 #[atom(CssAtomSet::Styleset)]
34 pub name: T![Function],
35 pub params: CommaSeparated<'a, Value<'a, CustomIdent>>,
36 #[semantic_eq(skip)]
37 pub close: T![')'],
38}
39
40#[node]
46#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
47#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
48#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
49#[derive(csskit_derives::NodeWithMetadata)]
50pub struct CharacterVariantFunction<'a> {
51 #[atom(CssAtomSet::CharacterVariant)]
52 pub name: T![Function],
53 pub params: CommaSeparated<'a, Value<'a, CustomIdent>>,
54 #[semantic_eq(skip)]
55 pub close: T![')'],
56}
57
58#[node]
64#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
65#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
66#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
67#[derive(csskit_derives::NodeWithMetadata)]
68pub struct SwashFunction<'a> {
69 #[atom(CssAtomSet::Swash)]
70 pub name: T![Function],
71 pub params: Value<'a, CustomIdent>,
72 #[semantic_eq(skip)]
73 pub close: T![')'],
74}
75
76#[node]
82#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
83#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
84#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
85#[derive(csskit_derives::NodeWithMetadata)]
86pub struct OrnamentsFunction<'a> {
87 #[atom(CssAtomSet::Ornaments)]
88 pub name: T![Function],
89 pub params: Value<'a, CustomIdent>,
90 #[semantic_eq(skip)]
91 pub close: T![')'],
92}
93
94#[node]
100#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
101#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
102#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
103#[derive(csskit_derives::NodeWithMetadata)]
104pub struct AnnotationFunction<'a> {
105 #[atom(CssAtomSet::Annotation)]
106 pub name: T![Function],
107 pub params: Value<'a, CustomIdent>,
108 #[semantic_eq(skip)]
109 pub close: T![')'],
110}
111
112#[cfg(test)]
113mod tests {
114 use super::*;
115 use crate::CssAtomSet;
116 use css_parse::{assert_parse, assert_parse_error};
117
118 #[test]
119 fn test_writes() {
120 assert_parse!(CssAtomSet::ATOMS, StylisticFunction, "stylistic(foo)");
121 assert_parse!(CssAtomSet::ATOMS, SwashFunction, "swash(fancy)");
122 assert_parse!(CssAtomSet::ATOMS, OrnamentsFunction, "ornaments(bullets)");
123 assert_parse!(CssAtomSet::ATOMS, AnnotationFunction, "annotation(circled)");
124 assert_parse!(CssAtomSet::ATOMS, StylesetFunction, "styleset(foo)");
125 assert_parse!(CssAtomSet::ATOMS, StylesetFunction, "styleset(foo,bar)");
126 assert_parse!(CssAtomSet::ATOMS, CharacterVariantFunction, "character-variant(foo,bar)");
127 }
128
129 #[test]
130 fn test_errors() {
131 assert_parse_error!(CssAtomSet::ATOMS, StylisticFunction, "stylistic()");
132 assert_parse_error!(CssAtomSet::ATOMS, StylisticFunction, "stylistic(foo,bar)");
133 assert_parse_error!(CssAtomSet::ATOMS, SwashFunction, "swash(1)");
134 assert_parse_error!(CssAtomSet::ATOMS, StylesetFunction, "styleset()");
135 }
136}