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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
mod item; pub use item::Item; mod visit_gen; pub use visit_gen::Observer; use crate::Node; pub struct Visitor<T> where T: Observer, { pub handler: T, } pub(crate) trait Visit<TItem> { fn visit(&mut self, item: TItem, visit_as: Item); } impl<TObserver: Observer> Visit<&[Node]> for Visitor<TObserver> { fn visit(&mut self, nodes: &[Node], visit_as: Item) { self.handler.on_subitem(visit_as); self.handler.on_node_list(nodes); for (idx, node) in nodes.iter().enumerate() { self.visit(node, Item::Idx(idx)); } self.handler.on_subitem_moving_up(visit_as); } } impl<TObserver: Observer> Visit<&Vec<Node>> for Visitor<TObserver> { fn visit(&mut self, nodes: &Vec<Node>, visit_as: Item) { let nodes: &[Node] = nodes; self.visit(nodes, visit_as); } } impl<TObserver: Observer> Visit<&Box<Node>> for Visitor<TObserver> { fn visit(&mut self, node: &Box<Node>, visit_as: Item) { let node: &Node = &*node; self.visit(node, visit_as); } } impl<TObserver: Observer> Visit<&Option<Box<Node>>> for Visitor<TObserver> { fn visit(&mut self, node: &Option<Box<Node>>, visit_as: Item) { if let Some(node) = node { self.visit(node, visit_as); } } } impl<T> Visitor<T> where T: Observer, { pub fn visit_root(&mut self, node: &Node) { self.visit(node, Item::Root); } }