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