compose_rt/
utils.rs

1use crate::composer::NodeKey;
2use crate::{ComposeNode, Composer};
3
4pub fn print_tree<N, D>(composer: &Composer<N>, node_key: NodeKey, display_fn: D)
5where
6    N: ComposeNode,
7    D: Fn(Option<&N>) -> String,
8{
9    println!("Root");
10    print_node(composer, node_key, &display_fn, false, String::new());
11}
12
13fn print_node<N, D>(
14    composer: &Composer<N>,
15    node_key: NodeKey,
16    display_fn: &D,
17    has_sibling: bool,
18    lines_string: String,
19) where
20    N: ComposeNode,
21    D: Fn(Option<&N>) -> String,
22{
23    let node = &composer.nodes[node_key];
24    let num_children = node.children.len();
25    let fork_string = if has_sibling {
26        "├── "
27    } else {
28        "└── "
29    };
30    let scope = node.scope_id;
31    println!(
32        "{lines}{fork} {display} [{scope:?} @ {node_key:?}]",
33        lines = lines_string,
34        fork = fork_string,
35        display = display_fn(node.data.as_ref()),
36        scope = scope,
37        node_key = node_key,
38    );
39    let bar = if has_sibling { "│   " } else { "    " };
40    let new_string = lines_string + bar;
41    // Recurse into children
42    for (index, child) in node.children.iter().cloned().enumerate() {
43        let has_sibling = index < num_children - 1;
44        print_node(composer, child, display_fn, has_sibling, new_string.clone());
45    }
46}