xee_xpath_ast/
pattern.rs

1use crate::ast;
2
3pub use crate::ast::{NameTest, NodeTest};
4
5// todo, put all pattern related stuff in a single package module
6pub 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    // one or more always
72    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}