anathema_widgets/tree/
debug.rs

1use std::ops::ControlFlow;
2
3use anathema_store::slab::Key;
4use anathema_store::tree::visitor::NodeVisitor;
5
6use crate::{WidgetContainer, WidgetKind};
7
8pub struct DebugTree {
9    level: usize,
10    pub output: String,
11}
12
13impl DebugTree {
14    pub fn new() -> Self {
15        Self {
16            level: 0,
17            output: String::new(),
18        }
19    }
20
21    fn write(&mut self, s: &str, key: Key) {
22        let indent = " ".repeat(self.level * 4);
23        self.output.push_str(&format!("{}:{} ", key.index(), key.generation()));
24        self.output.push_str(&indent);
25        self.output.push_str(s);
26        self.output.push('\n');
27    }
28}
29
30impl<'a> NodeVisitor<WidgetContainer<'a>> for DebugTree {
31    fn visit(&mut self, value: &mut WidgetContainer<'_>, _: &[u16], value_id: Key) -> ControlFlow<bool> {
32        match &value.kind {
33            WidgetKind::Element(element) => self.write(element.ident, value_id),
34            WidgetKind::For(_) => self.write("<for>", value_id),
35            WidgetKind::Iteration(_) => self.write("<iter>", value_id),
36            WidgetKind::ControlFlow(_) => self.write("<control flow>", value_id),
37            WidgetKind::ControlFlowContainer(_) => self.write("<control flow container>", value_id),
38            WidgetKind::Component(_) => self.write("<component>", value_id),
39            WidgetKind::Slot => self.write("<slot>", value_id),
40        }
41
42        ControlFlow::Continue(())
43    }
44
45    fn push(&mut self) {
46        self.level += 1;
47    }
48
49    fn pop(&mut self) {
50        self.level -= 1;
51    }
52}