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))]
15pub enum GenericFamily {}
16
17/// <https://drafts.csswg.org/css-fonts-4/#family-name-syntax>
18///
19/// ```text,ignore
20/// <generic-script-specific> = generic(fangsong) | generic(kai) | generic(khmer-mul) |  generic(nastaliq)
21/// ```
22#[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/// <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#[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/// <https://drafts.csswg.org/css-fonts-4/#family-name-syntax>
50///
51/// ```text,ignore
52/// <generic-complete> = serif | sans-serif | system-ui | cursive | fantasy | math | monospace
53/// ```
54#[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/// <https://drafts.csswg.org/css-fonts-4/#family-name-syntax>
74///
75/// ```text,ignore
76/// <generic-incomplete> = ui-serif | ui-sans-serif | ui-monospace | ui-rounded
77/// ```
78#[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}