use crate::{traversal::FlowControl, Text};
use super::{Branch, PreParsed, Section};
#[allow(unused_variables)]
#[rustfmt::skip]
pub trait Visitor {
#[must_use] fn visit_pre_parsed(&mut self, host: &PreParsed) -> FlowControl { FlowControl::default() }
#[must_use] fn visit_section(&mut self, host: &Section) -> FlowControl { FlowControl::default() }
#[must_use] fn visit_branch(&mut self, host: &Branch) -> FlowControl { FlowControl::default() }
fn visit_text(&mut self, host: &Text) {}
fn visit_definition(&mut self, host: &Text) {}
}
pub trait Walk {
fn walk(&self, visitor: &mut dyn Visitor);
}
impl Walk for PreParsed {
fn walk(&self, visitor: &mut dyn Visitor) {
if visitor.visit_pre_parsed(self) == FlowControl::Continue {
for section in self.sections.iter() {
section.walk(visitor);
}
}
}
}
impl Walk for Section {
fn walk(&self, visitor: &mut dyn Visitor) {
if visitor.visit_section(self) == FlowControl::Continue {
match self {
Section::Text(text) => visitor.visit_text(text),
Section::Branch(branch) => branch.walk(visitor),
Section::Definition(def) => visitor.visit_definition(def),
}
}
}
}
impl Walk for Branch {
fn walk(&self, visitor: &mut dyn Visitor) {
if visitor.visit_branch(self) == FlowControl::Continue {
for section in self.body.iter() {
section.walk(visitor);
}
if let Some(else_branch) = &self.else_ {
else_branch.walk(visitor);
}
}
}
}