1use chumsky::prelude::SimpleSpan;
2use ibig::IBig;
3use ordered_float::OrderedFloat;
4use rust_decimal::prelude::*;
5
6pub use xee_xpath_type::ast::*;
7
8pub use crate::operator::BinaryOperator;
9use crate::span::{Spanned, WithSpan};
10pub use crate::Name;
11
12pub type Span = SimpleSpan;
13
14pub type ExprSingleS = Spanned<ExprSingle>;
15pub type PrimaryExprS = Spanned<PrimaryExpr>;
16pub type StepExprS = Spanned<StepExpr>;
17pub type ExprS = Spanned<Expr>;
18pub type ExprOrEmpty = Option<Expr>;
19pub type ExprOrEmptyS = Spanned<ExprOrEmpty>;
20pub type NameS = Spanned<Name>;
21
22impl WithSpan for ExprSingle {}
23impl WithSpan for PrimaryExpr {}
24impl WithSpan for StepExpr {}
25impl WithSpan for Expr {}
26impl WithSpan for Name {}
27impl WithSpan for ExprOrEmpty {}
28
29#[derive(Debug, Clone, PartialEq, Eq)]
30#[cfg_attr(feature = "serde", derive(serde::Serialize))]
31pub struct Expr(pub Vec<ExprSingleS>);
32
33#[derive(Debug, Clone, PartialEq, Eq)]
34#[cfg_attr(feature = "serde", derive(serde::Serialize))]
35pub struct XPath(pub ExprS);
36
37#[derive(Debug, Clone, PartialEq, Eq)]
38#[cfg_attr(feature = "serde", derive(serde::Serialize))]
39pub enum ExprSingle {
40 Path(PathExpr),
42 Apply(ApplyExpr),
44 Let(LetExpr),
46 If(IfExpr),
47 Binary(BinaryExpr),
48 For(ForExpr),
49 Quantified(QuantifiedExpr),
50}
51
52#[derive(Debug, Clone, PartialEq, Eq)]
53#[cfg_attr(feature = "serde", derive(serde::Serialize))]
54pub struct ForExpr {
55 pub var_name: NameS,
56 pub var_expr: Box<ExprSingleS>,
57 pub return_expr: Box<ExprSingleS>,
58}
59
60#[derive(Debug, Clone, PartialEq, Eq)]
61#[cfg_attr(feature = "serde", derive(serde::Serialize))]
62pub struct QuantifiedExpr {
63 pub quantifier: Quantifier,
64 pub var_name: NameS,
65 pub var_expr: Box<ExprSingleS>,
66 pub satisfies_expr: Box<ExprSingleS>,
67}
68
69#[derive(Debug, Clone, PartialEq, Eq)]
70#[cfg_attr(feature = "serde", derive(serde::Serialize))]
71pub struct LetExpr {
72 pub var_name: NameS,
73 pub var_expr: Box<ExprSingleS>,
74 pub return_expr: Box<ExprSingleS>,
75}
76
77#[derive(Debug, Clone, PartialEq, Eq)]
78#[cfg_attr(feature = "serde", derive(serde::Serialize))]
79pub struct IfExpr {
80 pub condition: ExprS,
81 pub then: Box<ExprSingleS>,
82 pub else_: Box<ExprSingleS>,
83}
84
85#[derive(Debug, Clone, PartialEq, Eq)]
86#[cfg_attr(feature = "serde", derive(serde::Serialize))]
87pub enum Quantifier {
88 Some,
89 Every,
90}
91
92#[derive(Debug, Clone, PartialEq, Eq)]
93#[cfg_attr(feature = "serde", derive(serde::Serialize))]
94pub enum PrimaryExpr {
95 Literal(Literal),
96 VarRef(Name),
97 Expr(ExprOrEmptyS),
98 ContextItem,
99 FunctionCall(FunctionCall),
100 NamedFunctionRef(NamedFunctionRef),
101 InlineFunction(InlineFunction),
102 MapConstructor(MapConstructor),
103 ArrayConstructor(ArrayConstructor),
104 UnaryLookup(KeySpecifier),
105}
106
107#[derive(Debug, Clone, PartialEq, Eq)]
108#[cfg_attr(feature = "serde", derive(serde::Serialize))]
109pub enum KeySpecifier {
110 NcName(String),
111 Integer(IBig),
112 Expr(ExprOrEmptyS),
113 Star,
114}
115
116#[derive(Debug, Clone, PartialEq, Eq)]
117#[cfg_attr(feature = "serde", derive(serde::Serialize))]
118pub struct BinaryExpr {
119 pub operator: BinaryOperator,
120 pub left: PathExpr,
121 pub right: PathExpr,
122}
123
124#[derive(Debug, Clone, PartialEq, Eq)]
125#[cfg_attr(feature = "serde", derive(serde::Serialize))]
126pub struct ApplyExpr {
127 pub path_expr: PathExpr,
128 pub operator: ApplyOperator,
129}
130
131#[derive(Debug, Clone, PartialEq, Eq)]
132#[cfg_attr(feature = "serde", derive(serde::Serialize))]
133pub enum ApplyOperator {
134 SimpleMap(Vec<PathExpr>),
135 Unary(Vec<UnaryOperator>),
136 Cast(SingleType),
137 Castable(SingleType),
138 Treat(SequenceType),
139 InstanceOf(SequenceType),
140}
141
142#[derive(Debug, Clone, PartialEq, Eq)]
143#[cfg_attr(feature = "serde", derive(serde::Serialize))]
144pub enum UnaryOperator {
145 Plus,
146 Minus,
147}
148
149#[derive(Debug, Clone, PartialEq, Eq)]
150#[cfg_attr(feature = "serde", derive(serde::Serialize))]
151pub struct SingleType {
152 pub name: NameS,
153 pub optional: bool,
154}
155
156#[derive(Debug, Clone, PartialEq, Eq)]
157#[cfg_attr(feature = "serde", derive(serde::Serialize))]
158pub struct MapConstructor {
159 pub entries: Vec<MapConstructorEntry>,
160}
161
162#[derive(Debug, Clone, PartialEq, Eq)]
163#[cfg_attr(feature = "serde", derive(serde::Serialize))]
164pub struct MapConstructorEntry {
165 pub key: ExprSingleS,
166 pub value: ExprSingleS,
167}
168
169#[derive(Debug, Clone, PartialEq, Eq)]
170#[cfg_attr(feature = "serde", derive(serde::Serialize))]
171pub enum ArrayConstructor {
172 Square(ExprS),
173 Curly(ExprOrEmptyS),
174}
175
176#[derive(Debug, Clone, PartialEq, Eq)]
177#[cfg_attr(feature = "serde", derive(serde::Serialize))]
178pub enum Literal {
179 Decimal(Decimal),
180 Integer(IBig),
181 Double(OrderedFloat<f64>),
182 String(String),
183}
184
185#[derive(Debug, Clone, PartialEq, Eq)]
186#[cfg_attr(feature = "serde", derive(serde::Serialize))]
187pub struct FunctionCall {
188 pub name: NameS,
189 pub arguments: Vec<ExprSingleS>,
190}
191
192#[derive(Debug, Clone, PartialEq, Eq)]
193#[cfg_attr(feature = "serde", derive(serde::Serialize))]
194pub struct NamedFunctionRef {
195 pub name: NameS,
196 pub arity: u8,
197}
198
199#[derive(Debug, Clone, PartialEq, Eq)]
200#[cfg_attr(feature = "serde", derive(serde::Serialize))]
201pub struct InlineFunction {
202 pub params: Vec<Param>,
203 pub return_type: Option<SequenceType>,
204 pub body: ExprOrEmptyS,
205 pub wrapper: bool,
206}
207
208#[derive(Debug, Clone, PartialEq, Eq)]
211#[cfg_attr(feature = "serde", derive(serde::Serialize))]
212pub struct Signature {
213 pub name: NameS,
214 pub params: Vec<SignatureParam>,
215 pub return_type: SequenceType,
216}
217
218#[derive(Debug, Clone, PartialEq, Eq)]
219#[cfg_attr(feature = "serde", derive(serde::Serialize))]
220pub struct Param {
221 pub name: Name,
222 pub type_: Option<SequenceType>,
223}
224
225#[derive(Debug, Clone, PartialEq, Eq)]
226#[cfg_attr(feature = "serde", derive(serde::Serialize))]
227pub struct SignatureParam {
228 pub name: Name,
229 pub type_: SequenceType,
230}
231
232#[derive(Debug, Clone, PartialEq, Eq)]
233#[cfg_attr(feature = "serde", derive(serde::Serialize))]
234pub enum Postfix {
235 Predicate(ExprS),
237 ArgumentList(Vec<ExprSingleS>),
238 Lookup(KeySpecifier),
239}
240
241#[derive(Debug, Clone, PartialEq, Eq)]
242#[cfg_attr(feature = "serde", derive(serde::Serialize))]
243pub struct PathExpr {
244 pub steps: Vec<StepExprS>,
245}
246
247#[derive(Debug, Clone, PartialEq, Eq)]
248#[cfg_attr(feature = "serde", derive(serde::Serialize))]
249pub enum StepExpr {
250 PrimaryExpr(PrimaryExprS),
251 PostfixExpr {
252 primary: PrimaryExprS,
253 postfixes: Vec<Postfix>,
254 },
255 AxisStep(AxisStep),
256}
257
258#[derive(Debug, Clone, PartialEq, Eq)]
259#[cfg_attr(feature = "serde", derive(serde::Serialize))]
260pub struct AxisStep {
261 pub axis: Axis,
262 pub node_test: NodeTest,
263 pub predicates: Vec<ExprS>,
264}
265
266#[derive(Debug, Clone, PartialEq, Eq)]
267#[cfg_attr(feature = "serde", derive(serde::Serialize))]
268pub enum Axis {
269 Ancestor,
270 AncestorOrSelf,
271 Attribute,
272 Child,
273 Descendant,
274 DescendantOrSelf,
275 Following,
276 FollowingSibling,
277 Namespace,
278 Parent,
279 Preceding,
280 PrecedingSibling,
281 Self_,
282}
283
284#[derive(Debug, Clone, PartialEq, Eq)]
285#[cfg_attr(feature = "serde", derive(serde::Serialize))]
286pub enum NodeTest {
287 KindTest(KindTest),
288 NameTest(NameTest),
289}
290
291#[derive(Debug, Clone, PartialEq, Eq)]
292#[cfg_attr(feature = "serde", derive(serde::Serialize))]
293pub enum NameTest {
294 Name(NameS),
295 Star,
296 LocalName(String),
297 Namespace(String),
298}
299
300#[derive(Debug, Clone, PartialEq, Eq)]
301#[cfg_attr(feature = "serde", derive(serde::Serialize))]
302pub enum EQName {
303 QName(QName),
304 URIQualifiedName(URIQualifiedName),
305}
306
307#[derive(Debug, Clone, PartialEq, Eq)]
308#[cfg_attr(feature = "serde", derive(serde::Serialize))]
309pub enum QName {
310 PrefixedName(PrefixedName),
311 UnprefixedName(UnprefixedName),
312}
313
314#[derive(Debug, Clone, PartialEq, Eq)]
315#[cfg_attr(feature = "serde", derive(serde::Serialize))]
316pub struct PrefixedName {
317 pub prefix: String,
318 pub local_part: String,
319}
320
321#[derive(Debug, Clone, PartialEq, Eq)]
322#[cfg_attr(feature = "serde", derive(serde::Serialize))]
323pub struct UnprefixedName {
324 pub local_part: String,
325}
326
327#[derive(Debug, Clone, PartialEq, Eq)]
328#[cfg_attr(feature = "serde", derive(serde::Serialize))]
329pub struct URIQualifiedName {
330 pub uri: String,
331 pub local_part: String,
332}