cdoc_base/node/
visitor.rs

1use crate::node::{Compound, Node, Script};
2use anyhow::Result;
3
4pub trait NodeVisitor {
5    fn walk_elements(&mut self, elements: &mut [Node]) -> Result<()> {
6        elements.iter_mut().try_for_each(|e| self.visit_element(e))
7    }
8
9    fn walk_element(&mut self, element: &mut Node) -> Result<()> {
10        match element {
11            Node::Plain(text) => self.visit_plain(text),
12            Node::Compound(node) => self.visit_compound(node),
13            Node::Script(script) => self.visit_script(script),
14        }
15    }
16
17    fn walk_compound(&mut self, node: &mut Compound) -> Result<()> {
18        self.walk_elements(&mut node.children)
19    }
20
21    fn visit_element(&mut self, element: &mut Node) -> Result<()> {
22        self.walk_element(element)
23    }
24
25    fn visit_script(&mut self, _script: &mut Script) -> Result<()> {
26        Ok(())
27    }
28
29    fn visit_plain(&mut self, _text: &mut String) -> Result<()> {
30        Ok(())
31    }
32
33    fn visit_compound(&mut self, node: &mut Compound) -> Result<()> {
34        self.walk_compound(node)
35    }
36}