compose_rt/
utils.rs

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
use crate::composer::NodeKey;
use crate::{ComposeNode, Composer};

pub fn print_tree<N, D>(composer: &Composer<N>, node_key: NodeKey, display_fn: D)
where
    N: ComposeNode,
    D: Fn(Option<&N::Data>) -> String,
{
    println!("Root");
    print_node(composer, node_key, &display_fn, false, String::new());
}

fn print_node<N, D>(
    composer: &Composer<N>,
    node_key: NodeKey,
    display_fn: &D,
    has_sibling: bool,
    lines_string: String,
) where
    N: ComposeNode,
    D: Fn(Option<&N::Data>) -> String,
{
    let node = &composer.nodes[node_key];
    let num_children = node.children().len();
    let fork_string = if has_sibling {
        "├── "
    } else {
        "└── "
    };
    let scope = node.scope_id();
    println!(
        "{lines}{fork} {display} [{scope:?} @ {node_key:?}]",
        lines = lines_string,
        fork = fork_string,
        display = display_fn(node.data()),
        scope = scope,
        node_key = node_key,
    );
    let bar = if has_sibling { "│   " } else { "    " };
    let new_string = lines_string + bar;
    // Recurse into children
    for (index, child) in node.children().iter().cloned().enumerate() {
        let has_sibling = index < num_children - 1;
        print_node(composer, child, display_fn, has_sibling, new_string.clone());
    }
}