mod pattern;
pub use pattern::{Item as PatternItem, Pattern, PatternError};
use crate::traverse::visitor::Visitor;
use crate::Node;
#[derive(Debug)]
pub struct Finder {
pattern: Pattern,
result: Option<Node>,
}
mod finder_gen;
impl Finder {
pub fn run(pattern: &str, root: &Node) -> Result<Option<Node>, PatternError> {
let mut pattern = Pattern::new(pattern)?;
if pattern.parts.first() == Some(&PatternItem::Root) {
pattern.unshift();
}
let mut finder = Self {
pattern,
result: None,
};
finder.visit(root);
Ok(finder.result)
}
}
#[cfg(test)]
mod tests;