use crate::parser::Rule;
use super::Span;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum VisitAction {
Walk,
Skip,
}
#[derive(Debug, Clone, Copy)]
pub(super) struct Node {
pub(super) rule: Rule,
pub(super) span: Span,
}
pub(super) trait PairVisitor {
fn enter(&mut self, node: Node) -> VisitAction;
fn leave(&mut self, _node: Node) {}
fn walk_pairs(&mut self, pairs: pest::iterators::Pairs<'_, Rule>) {
for pair in pairs {
let node = Node {
rule: pair.as_rule(),
span: Span::new(pair.as_span().start(), pair.as_span().end()),
};
match self.enter(node) {
VisitAction::Walk => {
self.walk_pairs(pair.into_inner());
self.leave(node);
}
VisitAction::Skip => {}
}
}
}
}