#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct QName {
pub prefix: Option<String>,
pub local: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Axis {
Ancestor,
AncestorOrSelf,
Attribute,
Child,
Descendant,
DescendantOrSelf,
Following,
FollowingSibling,
Namespace,
Parent,
Preceding,
PrecedingSibling,
SelfAxis,
}
impl Axis {
pub fn from_name(name: &str) -> Option<Axis> {
Some(match name {
"ancestor" => Axis::Ancestor,
"ancestor-or-self" => Axis::AncestorOrSelf,
"attribute" => Axis::Attribute,
"child" => Axis::Child,
"descendant" => Axis::Descendant,
"descendant-or-self" => Axis::DescendantOrSelf,
"following" => Axis::Following,
"following-sibling" => Axis::FollowingSibling,
"namespace" => Axis::Namespace,
"parent" => Axis::Parent,
"preceding" => Axis::Preceding,
"preceding-sibling" => Axis::PrecedingSibling,
"self" => Axis::SelfAxis,
_ => return None,
})
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum NodeTest {
AnyName,
NamespaceWildcard(String),
QName(QName),
Node,
Text,
Comment,
ProcessingInstruction(Option<String>),
}
#[derive(Debug, Clone, PartialEq)]
pub struct Step {
pub axis: Axis,
pub node_test: NodeTest,
pub predicates: Vec<Expr>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct LocationPath {
pub is_absolute: bool,
pub steps: Vec<Step>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct FunctionCall {
pub name: QName,
pub args: Vec<Expr>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum PrimaryExpr {
Variable(QName),
Parenthesized(Box<Expr>),
Literal(String),
Number(f64),
Function(FunctionCall),
}
#[derive(Debug, Clone, PartialEq)]
pub struct FilterExpr {
pub primary: PrimaryExpr,
pub predicates: Vec<Expr>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum PathExpr {
Location(LocationPath),
Filter(FilterExpr),
FilterLocation(FilterExpr, LocationPath),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EqualityOp {
Eq,
Ne,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RelationalOp {
Lt,
Gt,
Le,
Ge,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AdditiveOp {
Add,
Sub,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MultiplicativeOp {
Mul,
Div,
Mod,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Expr {
Or(Box<Expr>, Box<Expr>),
And(Box<Expr>, Box<Expr>),
Equality(Box<Expr>, EqualityOp, Box<Expr>),
Relational(Box<Expr>, RelationalOp, Box<Expr>),
Additive(Box<Expr>, AdditiveOp, Box<Expr>),
Multiplicative(Box<Expr>, MultiplicativeOp, Box<Expr>),
Negate(Box<Expr>),
Union(Box<Expr>, Box<Expr>),
Path(PathExpr),
}