css_ast/types/
generic_family.rs1use css_parse::{Function, function_set, keyword_set};
2use csskit_derives::{Parse, Peek, ToCursors, ToSpan, Visitable};
3use csskit_proc_macro::syntax;
4
5function_set!(pub struct GenericScriptSpecificFunctionName "generic");
6
7#[syntax(" <generic-script-specific> | <generic-complete> | <generic-incomplete> ")]
16#[derive(Parse, Peek, ToCursors, ToSpan, Visitable, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
17#[cfg_attr(feature = "serde", derive(serde::Serialize), serde(rename_all = "kebab-case"))]
18#[visit(self)]
19pub enum GenericFamily {}
20
21#[derive(Peek, Parse, ToCursors, ToSpan, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
27#[cfg_attr(feature = "serde", derive(serde::Serialize), serde(rename_all = "kebab-case"))]
28pub struct GenericScriptSpecific(Function<GenericScriptSpecificFunctionName, GenericScriptSpecificKeyword>);
29
30keyword_set!(
31 pub enum GenericScriptSpecificKeyword {
37 Fangsong: "fangsong",
38 Kai: "kai",
39 KhmerMul: "khmer-mul",
40 Nastaliq: "nastaliq",
41 }
42);
43
44keyword_set!(
45 pub enum GenericComplete {
51 Serif: "serif"
52 SansSerif: "sans-serif",
53 SystemUi: "system-ui",
54 Cursive: "cursive",
55 Fantasy: "fantasy",
56 Math: "math",
57 Monospace: "monospace",
58 }
59);
60
61keyword_set!(
62 pub enum GenericIncomplete {
68 UiSerif: "ui-serif",
69 UiSansSerif: "ui-sans-serif",
70 UiMonospace: "ui-monospace",
71 UiRounded: "ui-rounded",
72 }
73);
74
75#[cfg(test)]
76mod tests {
77 use super::*;
78 use css_parse::{assert_parse, assert_parse_error};
79
80 #[test]
81 fn size_test() {
82 assert_eq!(std::mem::size_of::<GenericFamily>(), 44);
83 }
84
85 #[test]
86 fn test_writes() {
87 assert_parse!(GenericFamily, "sans-serif");
88 assert_parse!(GenericFamily, "ui-serif");
89 assert_parse!(GenericFamily, "generic(fangsong)");
90 }
91
92 #[test]
93 fn test_errors() {
94 assert_parse_error!(GenericFamily, "");
95 assert_parse_error!(GenericFamily, "'foo' bar");
96 }
97}