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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
use std::fmt;
use std::fmt::Write;
#[derive(Clone)]
pub enum Tree {
Node(String, Vec<Tree>),
Leaf(Vec<String>)
}
#[inline]
pub fn write_tree(f: &mut Write, tree: &Tree) -> fmt::Result { write_tree_element(f, tree, &vec![]) }
fn write_tree_element(f: &mut Write, tree: &Tree, level: &Vec<usize>) -> fmt::Result {
use Tree::*;
const EMPTY: &str = " ";
const EDGE: &str = " └─";
const PIPE: &str = " │ ";
const BRANCH: &str = " ├─";
let maxpos = level.len();
let mut second_line = String::new();
for (pos, l) in level.iter().enumerate() {
let last_row = pos == maxpos - 1;
if *l == 1 {
if !last_row { write!(f, "{}", EMPTY)? } else { write!(f, "{}", EDGE)? }
second_line.push_str(EMPTY);
} else {
if !last_row { write!(f, "{}", PIPE)? } else { write!(f, "{}", BRANCH)? }
second_line.push_str(PIPE);
}
}
match tree {
Node(title, children) => {
let mut d = children.len();
write!(f, " {}\n", title)?;
for s in children {
let mut lnext = level.clone();
lnext.push(d);
d -= 1;
write_tree_element(f, s, &lnext)?;
}
}
Leaf(lines) => {
for (i, s) in lines.iter().enumerate() {
match i {
0 => writeln!(f, " {}", s)?,
_ => writeln!(f, "{} {}", second_line, s)?
}
}
}
}
Ok(())
}