lib_ruby_parser_ast/traverse/finder/
mod.rs

1mod pattern;
2pub use pattern::{Item as PatternItem, Pattern, PatternError};
3
4use crate::traverse::visitor::Visitor;
5use crate::Node;
6
7/// A struct to find sub-nodes in AST by by a given `Pattern`
8#[derive(Debug)]
9pub struct Finder {
10    pattern: Pattern,
11    result: Option<Node>,
12}
13
14mod finder_gen;
15
16impl Finder {
17    /// Performs a search of a given pattern on a given AST.
18    ///
19    /// `pattern` is a string slice that is used to construct a `Pattern`.
20    pub fn run(pattern: &str, root: &Node) -> Result<Option<Node>, PatternError> {
21        let mut pattern = Pattern::new(pattern)?;
22        if pattern.parts.first() == Some(&PatternItem::Root) {
23            pattern.unshift();
24        }
25        let mut finder = Self {
26            pattern,
27            result: None,
28        };
29        finder.visit(root);
30        Ok(finder.result)
31    }
32}