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