1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
pub trait Node<'a> {}
pub struct SelectorsGroup<'a> {
pub selectors: Vec<Selector<'a>>,
}
impl<'a> Node<'a> for SelectorsGroup<'a> {}
pub struct Selector<'a> {
pub base: SelectorSequence<'a>,
pub modifiers: Vec<(Combinator, SelectorSequence<'a>)>,
}
impl<'a> Node<'a> for Selector<'a> {}
pub enum Combinator {
Plus,
Greater,
Tilde,
None,
}
pub struct SelectorSequence<'a> {
pub type_selector: Option<TypeSelector<'a>>,
pub attribute_selectors: Vec<AttributeSelector<'a>>,
}
impl<'a> Node<'a> for SelectorSequence<'a> {}
pub enum AttributeSelector<'a> {
Hash(&'a str),
Class(&'a str),
Attribute(Attribute<'a>),
Psuedo(Psuedo<'a>),
Negation(Negation<'a>),
}
impl<'a> Node<'a> for AttributeSelector<'a> {}
pub enum Namespace<'a> {
All,
Ident(&'a str),
}
impl<'a> Node<'a> for Namespace<'a> {}
pub struct TypeSelector<'a> {
pub namespace: Option<Namespace<'a>>,
pub element_name: Option<&'a str>,
}
impl<'a> Node<'a> for TypeSelector<'a> {}
pub enum Matcher {
Prefix,
Suffix,
Substring,
Equal,
Includes,
Dash,
}
pub struct Attribute<'a> {
pub namespace: Option<Namespace<'a>>,
pub name: &'a str,
pub matcher: Option<Matcher>,
pub value: Option<&'a str>,
}
impl<'a> Node<'a> for Attribute<'a> {}
pub struct Psuedo<'a> {
pub is_class_type: bool,
pub name: &'a str,
pub arg: Option<Expression<'a>>,
}
impl<'a> Node<'a> for Psuedo<'a> {}
pub struct Expression<'a> {
pub items: Vec<ExpressionItem<'a>>,
}
impl<'a> Node<'a> for Expression<'a> {}
pub enum ExpressionItem<'a> {
Plus,
Minus,
Dimension(&'a str, &'a str),
Number(&'a str),
Str(&'a str),
Ident(&'a str),
}
impl<'a> Node<'a> for ExpressionItem<'a> {}
pub enum Negation<'a> {
TypeSelector(TypeSelector<'a>),
Hash(&'a str),
Class(&'a str),
Attribute(Attribute<'a>),
Psuedo(Psuedo<'a>),
}
impl<'a> Node<'a> for Negation<'a> {}