1use malloc_size_of_derive::MallocSizeOf;
6use markup5ever::QualName;
7
8#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
9pub enum Expression {
10 Binary(Box<Expression>, BinaryOperator, Box<Expression>),
11 Negate(Box<Expression>),
12 Path(PathExpression),
13 LocationStep(LocationStepExpression),
15 Filter(FilterExpression),
16 Literal(Literal),
17 Variable(QName),
18 ContextItem,
19 Function(CoreFunction),
21}
22
23#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
24pub enum BinaryOperator {
25 Or,
26 And,
27 Union,
28 Equal,
30 NotEqual,
32 LessThan,
34 GreaterThan,
36 LessThanOrEqual,
38 GreaterThanOrEqual,
40 Add,
42 Subtract,
44 Multiply,
46 Divide,
48 Modulo,
50}
51
52#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
53pub struct PathExpression {
54 pub(crate) is_absolute: bool,
58 pub(crate) has_implicit_descendant_or_self_step: bool,
61 pub(crate) steps: Vec<Expression>,
62}
63
64#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
65pub struct PredicateListExpression {
66 pub(crate) predicates: Vec<Expression>,
67}
68
69#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
70pub struct FilterExpression {
71 pub(crate) expression: Box<Expression>,
72 pub(crate) predicates: PredicateListExpression,
73}
74
75#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
77pub struct LocationStepExpression {
78 pub(crate) axis: Axis,
79 pub(crate) node_test: NodeTest,
80 pub(crate) predicate_list: PredicateListExpression,
81}
82
83#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
84pub(crate) enum Axis {
85 Child,
86 Descendant,
87 Attribute,
88 Self_,
89 DescendantOrSelf,
90 FollowingSibling,
91 Following,
92 Namespace,
93 Parent,
94 Ancestor,
95 PrecedingSibling,
96 Preceding,
97 AncestorOrSelf,
98}
99
100#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
101pub(crate) enum NodeTest {
102 Name(QualName),
103 Wildcard,
104 Kind(KindTest),
105}
106
107#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
108pub struct QName {
109 pub(crate) prefix: Option<String>,
110 pub(crate) local_part: String,
111}
112
113impl std::fmt::Display for QName {
114 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
115 match &self.prefix {
116 Some(prefix) => write!(f, "{}:{}", prefix, self.local_part),
117 None => write!(f, "{}", self.local_part),
118 }
119 }
120}
121
122#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
123pub(crate) enum KindTest {
124 PI(Option<String>),
125 Comment,
126 Text,
127 Node,
128}
129
130#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
131pub enum Literal {
132 Integer(i64),
133 Decimal(f64),
134 String(String),
135}
136
137#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
139pub enum CoreFunction {
140 Last,
143 Position,
145 Count(Box<Expression>),
147 Id(Box<Expression>),
149 LocalName(Option<Box<Expression>>),
151 NamespaceUri(Option<Box<Expression>>),
153 Name(Option<Box<Expression>>),
155
156 String(Option<Box<Expression>>),
159 Concat(Vec<Expression>),
161 StartsWith(Box<Expression>, Box<Expression>),
163 Contains(Box<Expression>, Box<Expression>),
165 SubstringBefore(Box<Expression>, Box<Expression>),
167 SubstringAfter(Box<Expression>, Box<Expression>),
169 Substring(Box<Expression>, Box<Expression>, Option<Box<Expression>>),
171 StringLength(Option<Box<Expression>>),
173 NormalizeSpace(Option<Box<Expression>>),
175 Translate(Box<Expression>, Box<Expression>, Box<Expression>),
177
178 Number(Option<Box<Expression>>),
181 Sum(Box<Expression>),
183 Floor(Box<Expression>),
185 Ceiling(Box<Expression>),
187 Round(Box<Expression>),
189
190 Boolean(Box<Expression>),
193 Not(Box<Expression>),
195 True,
197 False,
199 Lang(Box<Expression>),
201}