1use malloc_size_of_derive::MallocSizeOf;
6
7#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
8pub enum Expression {
9 Binary(Box<Expression>, BinaryOperator, Box<Expression>),
10 Negate(Box<Expression>),
11 Path(PathExpression),
12 LocationStep(LocationStepExpression),
14 Filter(FilterExpression),
15 Literal(Literal),
16 Variable(QName),
17 ContextItem,
18 Function(CoreFunction),
20}
21
22#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
23pub enum BinaryOperator {
24 Or,
25 And,
26 Union,
27 Equal,
29 NotEqual,
31 LessThan,
33 GreaterThan,
35 LessThanOrEqual,
37 GreaterThanOrEqual,
39 Add,
41 Subtract,
43 Multiply,
45 Divide,
47 Modulo,
49}
50
51#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
52pub struct PathExpression {
53 pub(crate) is_absolute: bool,
57 pub(crate) has_implicit_descendant_or_self_step: bool,
60 pub(crate) steps: Vec<Expression>,
61}
62
63#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
64pub struct PredicateListExpression {
65 pub(crate) predicates: Vec<Expression>,
66}
67
68#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
69pub struct FilterExpression {
70 pub(crate) expression: Box<Expression>,
71 pub(crate) predicates: PredicateListExpression,
72}
73
74#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
76pub struct LocationStepExpression {
77 pub(crate) axis: Axis,
78 pub(crate) node_test: NodeTest,
79 pub(crate) predicate_list: PredicateListExpression,
80}
81
82#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
83pub(crate) enum Axis {
84 Child,
85 Descendant,
86 Attribute,
87 Self_,
88 DescendantOrSelf,
89 FollowingSibling,
90 Following,
91 Namespace,
92 Parent,
93 Ancestor,
94 PrecedingSibling,
95 Preceding,
96 AncestorOrSelf,
97}
98
99#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
100pub(crate) enum NodeTest {
101 Name(QName),
102 Wildcard,
103 Kind(KindTest),
104}
105
106#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
107pub struct QName {
108 pub(crate) prefix: Option<String>,
109 pub(crate) local_part: String,
110}
111
112impl std::fmt::Display for QName {
113 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
114 match &self.prefix {
115 Some(prefix) => write!(f, "{}:{}", prefix, self.local_part),
116 None => write!(f, "{}", self.local_part),
117 }
118 }
119}
120
121#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
122pub(crate) enum KindTest {
123 PI(Option<String>),
124 Comment,
125 Text,
126 Node,
127}
128
129#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
130pub enum Literal {
131 Integer(i64),
132 Decimal(f64),
133 String(String),
134}
135
136#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
138pub enum CoreFunction {
139 Last,
142 Position,
144 Count(Box<Expression>),
146 Id(Box<Expression>),
148 LocalName(Option<Box<Expression>>),
150 NamespaceUri(Option<Box<Expression>>),
152 Name(Option<Box<Expression>>),
154
155 String(Option<Box<Expression>>),
158 Concat(Vec<Expression>),
160 StartsWith(Box<Expression>, Box<Expression>),
162 Contains(Box<Expression>, Box<Expression>),
164 SubstringBefore(Box<Expression>, Box<Expression>),
166 SubstringAfter(Box<Expression>, Box<Expression>),
168 Substring(Box<Expression>, Box<Expression>, Option<Box<Expression>>),
170 StringLength(Option<Box<Expression>>),
172 NormalizeSpace(Option<Box<Expression>>),
174 Translate(Box<Expression>, Box<Expression>, Box<Expression>),
176
177 Number(Option<Box<Expression>>),
180 Sum(Box<Expression>),
182 Floor(Box<Expression>),
184 Ceiling(Box<Expression>),
186 Round(Box<Expression>),
188
189 Boolean(Box<Expression>),
192 Not(Box<Expression>),
194 True,
196 False,
198 Lang(Box<Expression>),
200}