anathema_widgets/tree/
debug.rs1use 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}