Skip to main content

libxml_rs/xml/xpath/
mod.rs

1//! XPath 1.0 implementation (§25, §85 Phase 5).
2//!
3//! Complete XPath 1.0 engine: location paths, axes, node tests, predicates,
4//! functions, variables, namespaces, node sets, boolean/number/string
5//! conversion, comparison semantics, NaN/infinity/negative zero, document
6//! order, context position/size, extension functions, compiled expressions.
7//!
8//! # Modules
9//!
10//! - `ast` — expression AST types (axes, node tests, steps, operators)
11//! - `lexer` — tokenizer
12//! - `parser` — recursive descent parser
13//! - `types` — XPath value types (node sets, numbers, strings, booleans)
14//! - `context` — evaluation context (variables, namespaces, functions)
15//! - `axes` — axis traversal
16//! - `functions` — core function library (25 XPath 1.0 functions)
17//! - `eval` — evaluation engine
18
19pub mod ast;
20pub mod axes;
21pub mod context;
22pub mod eval;
23pub mod exports;
24pub mod functions;
25pub mod lexer;
26pub mod parser;
27pub mod parser_context;
28pub mod types;
29
30use ast::CompiledExpr;
31use context::XPathContext;
32use parser::parse_xpath;
33use types::XPathValue;
34
35/// Parse and compile an XPath expression string.
36///
37/// Returns `None` on parse error.
38pub fn compile(expr_str: &str) -> Option<CompiledExpr> {
39    match parse_xpath(expr_str) {
40        Ok(expr) => Some(CompiledExpr::new(expr_str.to_string(), expr)),
41        Err(_) => None,
42    }
43}
44
45/// Evaluate a compiled XPath expression.
46///
47/// Returns `None` on evaluation error; the error message is recorded on the
48/// context (`XPathContext::error`) so callers can surface it exactly as
49/// upstream does ("XPath error : ...").
50pub fn evaluate(compiled: &CompiledExpr, context: &mut XPathContext) -> Option<XPathValue> {
51    match eval::eval(context, &compiled.expr) {
52        Ok(value) => Some(value),
53        Err(msg) => {
54            context.set_error(&msg);
55            None
56        }
57    }
58}
59
60/// Parse and evaluate in one step.
61pub fn evaluate_str(expr_str: &str, context: &mut XPathContext) -> Option<XPathValue> {
62    compile(expr_str).and_then(|compiled| evaluate(&compiled, context))
63}