xee_xpath_ast/ast/
ast_core.rs

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    // a path expression
41    Path(PathExpr),
42    // something applied to a path expression
43    Apply(ApplyExpr),
44    // combine two path expressions
45    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// a function signature as described by:
209// https://www.w3.org/TR/xpath-functions-31/#func-signatures
210#[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    // vec contains at least 1 element
236    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}