cdoc_base/node/
visitor.rs1use 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}