css_ast/types/
generic_family.rs

1use super::prelude::*;
2
3/// <https://drafts.csswg.org/css-fonts-4/#family-name-syntax>
4///
5/// ```text,ignore
6/// <generic-family> = <generic-script-specific> | <generic-complete> | <generic-incomplete>
7/// <generic-script-specific> = generic(fangsong) | generic(kai) | generic(khmer-mul) |  generic(nastaliq)
8/// <generic-complete> = serif | sans-serif | system-ui | cursive | fantasy | math | monospace
9/// <generic-incomplete> = ui-serif | ui-sans-serif | ui-monospace | ui-rounded
10/// ```
11#[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/// <https://drafts.csswg.org/css-fonts-4/#family-name-syntax>
19///
20/// ```text,ignore
21/// <generic-script-specific> = generic(fangsong) | generic(kai) | generic(khmer-mul) |  generic(nastaliq)
22/// ```
23#[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/// <https://drafts.csswg.org/css-fonts-4/#family-name-syntax>
33///
34/// ```text,ignore
35/// <generic-script-specific> = generic(fangsong) | generic(kai) | generic(khmer-mul) |  generic(nastaliq)
36/// ```
37#[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/// <https://drafts.csswg.org/css-fonts-4/#family-name-syntax>
51///
52/// ```text,ignore
53/// <generic-complete> = serif | sans-serif | system-ui | cursive | fantasy | math | monospace
54/// ```
55#[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/// <https://drafts.csswg.org/css-fonts-4/#family-name-syntax>
75///
76/// ```text,ignore
77/// <generic-incomplete> = ui-serif | ui-sans-serif | ui-monospace | ui-rounded
78/// ```
79#[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}