1use crate::ast;
2
3pub use crate::ast::{NameTest, NodeTest};
4
5pub use crate::pattern_transform::transform_pattern;
7
8#[derive(Debug, Clone, PartialEq, Eq)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize))]
10pub enum Pattern<E> {
11 Predicate(PredicatePattern<E>),
12 Expr(ExprPattern<E>),
13}
14
15#[derive(Debug, Clone, PartialEq, Eq)]
16#[cfg_attr(feature = "serde", derive(serde::Serialize))]
17pub struct PredicatePattern<E> {
18 pub predicates: Vec<E>,
19}
20
21#[derive(Debug, Clone, PartialEq, Eq)]
22#[cfg_attr(feature = "serde", derive(serde::Serialize))]
23pub enum ExprPattern<E> {
24 Path(PathExpr<E>),
25 BinaryExpr(BinaryExpr<E>),
26}
27
28#[derive(Debug, Clone, PartialEq, Eq)]
29#[cfg_attr(feature = "serde", derive(serde::Serialize))]
30pub struct BinaryExpr<E> {
31 pub operator: Operator,
32 pub left: Box<ExprPattern<E>>,
33 pub right: Box<ExprPattern<E>>,
34}
35
36#[derive(Debug, Clone, Copy, PartialEq, Eq)]
37#[cfg_attr(feature = "serde", derive(serde::Serialize))]
38pub enum Operator {
39 Union,
40 Intersect,
41 Except,
42}
43
44#[derive(Debug, Clone, PartialEq, Eq)]
45#[cfg_attr(feature = "serde", derive(serde::Serialize))]
46pub struct PathExpr<E> {
47 pub root: PathRoot<E>,
48 pub steps: Vec<StepExpr<E>>,
49}
50
51#[derive(Debug, Clone, PartialEq, Eq)]
52#[cfg_attr(feature = "serde", derive(serde::Serialize))]
53pub enum PathRoot<E> {
54 Rooted { root: RootExpr, predicates: Vec<E> },
55 AbsoluteSlash,
56 AbsoluteDoubleSlash,
57 Relative,
58}
59
60#[derive(Debug, Clone, PartialEq, Eq)]
61#[cfg_attr(feature = "serde", derive(serde::Serialize))]
62pub enum RootExpr {
63 VarRef(ast::Name),
64 FunctionCall(FunctionCall),
65}
66
67#[derive(Debug, Clone, PartialEq, Eq)]
68#[cfg_attr(feature = "serde", derive(serde::Serialize))]
69pub struct FunctionCall {
70 pub name: OuterFunctionName,
71 pub args: Vec<Argument>,
73}
74
75#[derive(Debug, Clone, PartialEq, Eq)]
76#[cfg_attr(feature = "serde", derive(serde::Serialize))]
77pub enum OuterFunctionName {
78 Doc,
79 Id,
80 ElementWithId,
81 Key,
82 Root,
83}
84
85#[derive(Debug, Clone, PartialEq, Eq)]
86#[cfg_attr(feature = "serde", derive(serde::Serialize))]
87pub enum Argument {
88 VarRef(ast::Name),
89 Literal(ast::Literal),
90}
91
92#[derive(Debug, Clone, PartialEq, Eq)]
93#[cfg_attr(feature = "serde", derive(serde::Serialize))]
94pub enum StepExpr<E> {
95 PostfixExpr(PostfixExpr<E>),
96 AxisStep(AxisStep<E>),
97}
98
99#[derive(Debug, Clone, PartialEq, Eq)]
100#[cfg_attr(feature = "serde", derive(serde::Serialize))]
101pub struct PostfixExpr<E> {
102 pub expr: ExprPattern<E>,
103 pub predicates: Vec<E>,
104}
105
106#[derive(Debug, Clone, PartialEq, Eq)]
107#[cfg_attr(feature = "serde", derive(serde::Serialize))]
108pub struct AxisStep<E> {
109 pub forward: ForwardAxis,
110 pub node_test: ast::NodeTest,
111 pub predicates: Vec<E>,
112}
113
114#[derive(Debug, Clone, PartialEq, Eq)]
115#[cfg_attr(feature = "serde", derive(serde::Serialize))]
116pub struct ForwardAxisNodeTest {
117 pub axis: ForwardAxis,
118 pub node_test: ast::NodeTest,
119}
120
121#[derive(Debug, Clone, Copy, PartialEq, Eq)]
122#[cfg_attr(feature = "serde", derive(serde::Serialize))]
123pub enum ForwardAxis {
124 Child,
125 Descendant,
126 Attribute,
127 Self_,
128 DescendantOrSelf,
129 Namespace,
130}