1use super::prelude::*;
2
3#[syntax(" <generic-script-specific> | <generic-complete> | <generic-incomplete> ")]
12#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
13#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
14#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
15#[derive(csskit_derives::NodeWithMetadata)]
16pub enum GenericFamily {}
17
18#[derive(Peek, Parse, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
24#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
25pub struct GenericScriptSpecific {
26 #[atom(CssAtomSet::Generic)]
27 pub name: T![Function],
28 pub params: GenericScriptSpecificKeyword,
29 pub close: T![')'],
30}
31
32#[derive(Peek, Parse, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
38#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
39pub enum GenericScriptSpecificKeyword {
40 #[atom(CssAtomSet::Fangsong)]
41 Fangsong(T![Ident]),
42 #[atom(CssAtomSet::Kai)]
43 Kai(T![Ident]),
44 #[atom(CssAtomSet::KhmerMul)]
45 KhmerMul(T![Ident]),
46 #[atom(CssAtomSet::Nastaliq)]
47 Nastaliq(T![Ident]),
48}
49
50#[derive(Peek, Parse, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
56#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
57pub enum GenericComplete {
58 #[atom(CssAtomSet::Serif)]
59 Serif(T![Ident]),
60 #[atom(CssAtomSet::SansSerif)]
61 SansSerif(T![Ident]),
62 #[atom(CssAtomSet::SystemUi)]
63 SystemUi(T![Ident]),
64 #[atom(CssAtomSet::Cursive)]
65 Cursive(T![Ident]),
66 #[atom(CssAtomSet::Fantasy)]
67 Fantasy(T![Ident]),
68 #[atom(CssAtomSet::Math)]
69 Math(T![Ident]),
70 #[atom(CssAtomSet::Monospace)]
71 Monospace(T![Ident]),
72}
73
74#[derive(Peek, Parse, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
80#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
81pub enum GenericIncomplete {
82 #[atom(CssAtomSet::UiSerif)]
83 UiSerif(T![Ident]),
84 #[atom(CssAtomSet::UiSansSerif)]
85 UiSansSerif(T![Ident]),
86 #[atom(CssAtomSet::UiMonospace)]
87 UiMonospace(T![Ident]),
88 #[atom(CssAtomSet::UiRounded)]
89 UiRounded(T![Ident]),
90}
91
92#[cfg(test)]
93mod tests {
94 use super::*;
95 use crate::CssAtomSet;
96 use css_parse::{assert_parse, assert_parse_error};
97
98 #[test]
99 fn size_test() {
100 assert_eq!(std::mem::size_of::<GenericFamily>(), 40);
101 }
102
103 #[test]
104 fn test_writes() {
105 assert_parse!(CssAtomSet::ATOMS, GenericFamily, "sans-serif");
106 assert_parse!(CssAtomSet::ATOMS, GenericFamily, "ui-serif");
107 assert_parse!(CssAtomSet::ATOMS, GenericFamily, "generic(fangsong)");
108 }
109
110 #[test]
111 fn test_errors() {
112 assert_parse_error!(CssAtomSet::ATOMS, GenericFamily, "");
113 assert_parse_error!(CssAtomSet::ATOMS, GenericFamily, "'foo' bar");
114 }
115}