css_ast/functions/
symbols_function.rs

1use super::prelude::*;
2use crate::{CssAtomSet, types::Image};
3
4/// <https://drafts.csswg.org/css-counter-styles-3/#funcdef-symbols>
5///
6/// ```text,ignore
7/// symbols() = symbols( <symbols-type>? [ <string> | <image> ]+ )
8/// ```
9#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
11#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
12pub struct SymbolsFunction<'a> {
13	#[atom(CssAtomSet::Symbols)]
14	pub name: T![Function],
15	pub params: SymbolsFunctionParams<'a>,
16	pub close: T![')'],
17}
18
19#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
20#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
21#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
22pub struct SymbolsFunctionParams<'a> {
23	pub symbols_type: Option<SymbolsType>,
24	pub symbols: Vec<'a, Symbol<'a>>,
25}
26
27/// <https://drafts.csswg.org/css-counter-styles-3/#typedef-symbols-type>
28///
29/// ```text,ignore
30/// <symbols-type> = cyclic | numeric | alphabetic | symbolic | fixed
31/// ```
32#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
33#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
34#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(skip))]
35pub enum SymbolsType {
36	#[atom(CssAtomSet::Cyclic)]
37	Cyclic(T![Ident]),
38	#[atom(CssAtomSet::Numeric)]
39	Numeric(T![Ident]),
40	#[atom(CssAtomSet::Alphabetic)]
41	Alphabetic(T![Ident]),
42	#[atom(CssAtomSet::Symbolic)]
43	Symbolic(T![Ident]),
44	#[atom(CssAtomSet::Fixed)]
45	Fixed(T![Ident]),
46}
47
48/// <https://drafts.csswg.org/css-counter-styles-3/#funcdef-symbols>
49///
50/// A single Symbol from the `<symbols()>` syntax
51///
52/// ```text,ignore
53/// <string> | <image>
54/// ```
55#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
56#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
57#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(children))]
58#[allow(clippy::large_enum_variant)] // TODO: Box or shrink Image
59pub enum Symbol<'a> {
60	#[cfg_attr(feature = "visitable", visit(skip))]
61	String(T![String]),
62	Image(Image<'a>),
63}
64
65#[cfg(test)]
66mod tests {
67	use super::*;
68	use crate::CssAtomSet;
69	use css_parse::assert_parse;
70
71	#[test]
72	fn size_test() {
73		assert_eq!(std::mem::size_of::<SymbolsFunction>(), 72);
74		assert_eq!(std::mem::size_of::<Symbol>(), 208);
75		assert_eq!(std::mem::size_of::<SymbolsType>(), 16);
76	}
77
78	#[test]
79	fn test_writes() {
80		assert_parse!(CssAtomSet::ATOMS, SymbolsFunction, "symbols(symbolic'+')");
81		assert_parse!(CssAtomSet::ATOMS, SymbolsFunction, "symbols(symbolic'*''†''‡')");
82	}
83}