pub(crate) mod analyze;
pub mod ast;
pub(crate) mod eval;
pub(crate) mod parser;
pub(crate) mod simd_pred;
pub use ast::XPathExpr;
pub use eval::{eval_standalone_expr, extract_text, StandaloneResult, XPathNode, XPathResult};
#[doc(hidden)]
pub use eval::{evaluate, evaluate_from_context};
pub(crate) use eval::{eval_text, eval_expr_with_doc, eval_expr_with_context, eval_xpath};
#[doc(hidden)]
pub use parser::parse_xpath;
use crate::error::Result;
use crate::index::XmlIndex;
pub struct CompiledXPath {
expr: XPathExpr,
}
impl CompiledXPath {
pub fn compile(xpath: &str) -> Result<Self> {
let expr = parse_xpath(xpath)?;
Ok(Self { expr })
}
pub fn eval<'a>(&self, index: &'a XmlIndex<'a>) -> Result<Vec<XPathNode>> {
evaluate(index, &self.expr)
}
pub fn eval_text<'a>(&self, index: &'a XmlIndex<'a>) -> Result<Vec<&'a str>> {
eval_text(index, &self.expr)
}
pub fn interesting_names(&self) -> Option<std::collections::HashSet<String>> {
match analyze::selectivity(&self.expr) {
analyze::SelectivityHint::Selective(names) => Some(names),
analyze::SelectivityHint::NeedsAll => None,
}
}
pub fn expr(&self) -> &XPathExpr {
&self.expr
}
}