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 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}