1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use crate::node::{Compound, Node, Script};
use anyhow::Result;

pub trait NodeVisitor {
    fn walk_elements(&mut self, elements: &mut [Node]) -> Result<()> {
        elements.iter_mut().try_for_each(|e| self.visit_element(e))
    }

    fn walk_element(&mut self, element: &mut Node) -> Result<()> {
        match element {
            Node::Plain(text) => self.visit_plain(text),
            Node::Compound(node) => self.visit_compound(node),
            Node::Script(script) => self.visit_script(script),
        }
    }

    fn walk_compound(&mut self, node: &mut Compound) -> Result<()> {
        self.walk_elements(&mut node.children)
    }

    fn visit_element(&mut self, element: &mut Node) -> Result<()> {
        self.walk_element(element)
    }

    fn visit_script(&mut self, _script: &mut Script) -> Result<()> {
        Ok(())
    }

    fn visit_plain(&mut self, _text: &mut String) -> Result<()> {
        Ok(())
    }

    fn visit_compound(&mut self, node: &mut Compound) -> Result<()> {
        self.walk_compound(node)
    }
}