Skip to main content

anathema_widgets/tree/
debug.rs

1use std::fmt::{Result, Write};
2
3use anathema_store::tree::{Node, TreeValues};
4
5use crate::{WidgetContainer, WidgetId, WidgetKind, WidgetTreeView};
6
7pub fn debug_tree(tree: &WidgetTreeView<'_, '_>) -> String {
8    let mut output = String::new();
9
10    let (nodes, values) = tree.nodes_and_values();
11
12    walk_tree(0, nodes, values, &mut output).unwrap();
13    output
14}
15
16fn walk_tree(level: usize, nodes: &[Node], values: &TreeValues<WidgetContainer<'_>>, output: &mut String) -> Result {
17    for node in nodes {
18        let Some((_, widget)) = values.get(node.value()) else { continue };
19        write_value(widget, level + 1, node.value(), output)?;
20        walk_tree(level + 1, node.children(), values, output)?;
21    }
22
23    Ok(())
24}
25
26fn write_value(widget: &WidgetContainer<'_>, level: usize, widget_id: WidgetId, output: &mut String) -> Result {
27    write!(output, "{}:{}", widget_id.index(), widget_id.generation())?;
28    let indent = " ".repeat(level * 4);
29    write!(output, "{indent}{}:{} ", widget_id.index(), widget_id.generation())?;
30
31    match &widget.kind {
32        WidgetKind::Element(element) => writeln!(output, "{}", element.ident),
33        WidgetKind::For(_) => writeln!(output, "<for>"),
34        WidgetKind::With(_) => writeln!(output, "<with>"),
35        WidgetKind::Iteration(_) => writeln!(output, "<iter>"),
36        WidgetKind::ControlFlow(_) => writeln!(output, "<control flow>"),
37        WidgetKind::ControlFlowContainer(_) => writeln!(output, "<control flow container>"),
38        WidgetKind::Component(_) => writeln!(output, "<component>"),
39        WidgetKind::Slot => writeln!(output, "<slot>"),
40    }
41}