css_ast/types/
generic_family.rs

1use 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/// <https://drafts.csswg.org/css-fonts-4/#family-name-syntax>
8///
9/// ```text,ignore
10/// <generic-family> = <generic-script-specific> | <generic-complete> | <generic-incomplete>
11/// <generic-script-specific> = generic(fangsong) | generic(kai) | generic(khmer-mul) |  generic(nastaliq)
12/// <generic-complete> = serif | sans-serif | system-ui | cursive | fantasy | math | monospace
13/// <generic-incomplete> = ui-serif | ui-sans-serif | ui-monospace | ui-rounded
14/// ```
15#[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/// <https://drafts.csswg.org/css-fonts-4/#family-name-syntax>
22///
23/// ```text,ignore
24/// <generic-script-specific> = generic(fangsong) | generic(kai) | generic(khmer-mul) |  generic(nastaliq)
25/// ```
26#[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	/// <https://drafts.csswg.org/css-fonts-4/#family-name-syntax>
32	///
33	/// ```text,ignore
34	/// <generic-script-specific> = generic(fangsong) | generic(kai) | generic(khmer-mul) |  generic(nastaliq)
35	/// ```
36	pub enum GenericScriptSpecificKeyword {
37		Fangsong: "fangsong",
38		Kai: "kai",
39		KhmerMul: "khmer-mul",
40		Nastaliq: "nastaliq",
41	}
42);
43
44keyword_set!(
45	/// <https://drafts.csswg.org/css-fonts-4/#family-name-syntax>
46	///
47	/// ```text,ignore
48	/// <generic-complete> = serif | sans-serif | system-ui | cursive | fantasy | math | monospace
49	/// ```
50	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	/// <https://drafts.csswg.org/css-fonts-4/#family-name-syntax>
63	///
64	/// ```text,ignore
65	/// <generic-incomplete> = ui-serif | ui-sans-serif | ui-monospace | ui-rounded
66	/// ```
67	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}