1use super::prelude::*;
2
3use crate::SymbolsFunction;
4
5#[derive(Parse, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
7#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit)]
8#[derive(csskit_derives::NodeWithMetadata)]
9pub enum CounterStyle<'a> {
10 #[cfg_attr(feature = "visitable", visit(skip))]
11 Predefined(PredefinedCounter),
12 #[cfg_attr(feature = "visitable", visit(skip))]
13 Named(T![Ident]),
14 SymbolsFunction(SymbolsFunction<'a>),
15}
16
17impl<'a> Peek<'a> for CounterStyle<'a> {
18 fn peek<I>(p: &Parser<'a, I>, c: Cursor) -> bool
19 where
20 I: Iterator<Item = Cursor> + Clone,
21 {
22 <T![Ident]>::peek(p, c) || <SymbolsFunction>::peek(p, c)
23 }
24}
25
26#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
28#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
29pub enum PredefinedCounter {
30 #[atom(CssAtomSet::Decimal)]
31 Decimal(T![Ident]),
32 #[atom(CssAtomSet::DecimalLeadingZero)]
33 DecimalLeadingZero(T![Ident]),
34 #[atom(CssAtomSet::ArabicIndic)]
35 ArabicIndic(T![Ident]),
36 #[atom(CssAtomSet::Armenian)]
37 Armenian(T![Ident]),
38 #[atom(CssAtomSet::UpperArmenian)]
39 UpperArmenian(T![Ident]),
40 #[atom(CssAtomSet::LowerArmenian)]
41 LowerArmenian(T![Ident]),
42 #[atom(CssAtomSet::Bengali)]
43 Bengali(T![Ident]),
44 #[atom(CssAtomSet::Cambodian)]
45 Cambodian(T![Ident]),
46 #[atom(CssAtomSet::Khmer)]
47 Khmer(T![Ident]),
48 #[atom(CssAtomSet::CjkDecimal)]
49 CjkDecimal(T![Ident]),
50 #[atom(CssAtomSet::Devanagari)]
51 Devanagari(T![Ident]),
52 #[atom(CssAtomSet::Georgian)]
53 Georgian(T![Ident]),
54 #[atom(CssAtomSet::Gujarati)]
55 Gujarati(T![Ident]),
56 #[atom(CssAtomSet::Gurmukhi)]
57 Gurmukhi(T![Ident]),
58 #[atom(CssAtomSet::Hebrew)]
59 Hebrew(T![Ident]),
60 #[atom(CssAtomSet::Kannada)]
61 Kannada(T![Ident]),
62 #[atom(CssAtomSet::Lao)]
63 Lao(T![Ident]),
64 #[atom(CssAtomSet::Malayalam)]
65 Malayalam(T![Ident]),
66 #[atom(CssAtomSet::Mongolian)]
67 Mongolian(T![Ident]),
68 #[atom(CssAtomSet::Myanmar)]
69 Myanmar(T![Ident]),
70 #[atom(CssAtomSet::Oriya)]
71 Oriya(T![Ident]),
72 #[atom(CssAtomSet::Persian)]
73 Persian(T![Ident]),
74 #[atom(CssAtomSet::LowerRoman)]
75 LowerRoman(T![Ident]),
76 #[atom(CssAtomSet::UpperRoman)]
77 UpperRoman(T![Ident]),
78 #[atom(CssAtomSet::Tamil)]
79 Tamil(T![Ident]),
80 #[atom(CssAtomSet::Telugu)]
81 Telugu(T![Ident]),
82 #[atom(CssAtomSet::Thai)]
83 Thai(T![Ident]),
84 #[atom(CssAtomSet::Tibetan)]
85 Tibetan(T![Ident]),
86 #[atom(CssAtomSet::LowerAlpha)]
87 LowerAlpha(T![Ident]),
88 #[atom(CssAtomSet::UpperAlpha)]
89 UpperAlpha(T![Ident]),
90 #[atom(CssAtomSet::UpperLatin)]
91 UpperLatin(T![Ident]),
92 #[atom(CssAtomSet::LowerGreek)]
93 LowerGreek(T![Ident]),
94 #[atom(CssAtomSet::Hiragana)]
95 Hiragana(T![Ident]),
96 #[atom(CssAtomSet::HiraganaIroha)]
97 HiraganaIroha(T![Ident]),
98 #[atom(CssAtomSet::Katakana)]
99 Katakana(T![Ident]),
100 #[atom(CssAtomSet::KatakanaIroha)]
101 KatakanaIroha(T![Ident]),
102 #[atom(CssAtomSet::Disc)]
103 Disc(T![Ident]),
104 #[atom(CssAtomSet::Square)]
105 Square(T![Ident]),
106 #[atom(CssAtomSet::DisclousureOpen)]
107 DisclousureOpen(T![Ident]),
108 #[atom(CssAtomSet::DisclousureClosed)]
109 DisclousureClosed(T![Ident]),
110 #[atom(CssAtomSet::CjkEarthlyBranch)]
111 CjkEarthlyBranch(T![Ident]),
112 #[atom(CssAtomSet::CjkHeavenlyStem)]
113 CjkHeavenlyStem(T![Ident]),
114}
115
116#[cfg(test)]
117mod tests {
118 use super::*;
119 use crate::CssAtomSet;
120 use css_parse::assert_parse;
121
122 #[test]
123 fn size_test() {
124 assert_eq!(std::mem::size_of::<CounterStyle>(), 72);
125 }
126
127 #[test]
128 fn test_writes() {
129 assert_parse!(CssAtomSet::ATOMS, CounterStyle, "cjk-heavenly-stem");
130 assert_parse!(CssAtomSet::ATOMS, CounterStyle, "foobar");
131 assert_parse!(CssAtomSet::ATOMS, CounterStyle, "symbols(symbolic'+')");
132 }
133}