Skip to content

Commit b45c77c

Browse files
committed
implement Display for Tree
1 parent c6dd38e commit b45c77c

File tree

3 files changed

+72
-1
lines changed

3 files changed

+72
-1
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
target
22
Cargo.lock
3+
.vscode

src/lib.rs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
missing_copy_implementations
3636
)]
3737

38-
use std::fmt::{self, Debug, Formatter};
38+
use std::fmt::{self, Debug, Display, Formatter};
3939
use std::num::NonZeroUsize;
4040

4141
/// Vec-backed ID-tree.
@@ -718,3 +718,41 @@ impl<T: Debug> Debug for Tree<T> {
718718
}
719719
}
720720
}
721+
722+
impl<T: Display> Display for Tree<T> {
723+
fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
724+
use iter::Edge;
725+
726+
fn indent(f: &mut Formatter, level: usize) -> Result<(), fmt::Error> {
727+
for _ in 0..level {
728+
write!(f, " ")?;
729+
}
730+
Ok(())
731+
}
732+
733+
let mut level: usize = 0;
734+
735+
for edge in self.root().traverse() {
736+
match edge {
737+
Edge::Open(node) if node.has_children() => {
738+
indent(f, level)?;
739+
write!(f, "{}\n", node.value())?;
740+
level += 1;
741+
}
742+
Edge::Open(node) if node.next_sibling().is_some() => {
743+
indent(f, level)?;
744+
write!(f, "{}\n", node.value())?;
745+
}
746+
Edge::Open(node) => {
747+
indent(f, level)?;
748+
write!(f, "{}\n", node.value())?;
749+
}
750+
Edge::Close(node) if node.has_children() => {
751+
level -= 1;
752+
}
753+
_ => {}
754+
}
755+
}
756+
Ok(())
757+
}
758+
}

tests/tree.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,3 +156,35 @@ fn insert_id_before() {
156156
);
157157
assert_eq!(3, tree.root().children().count());
158158
}
159+
160+
#[test]
161+
fn test_display() {
162+
let tree = tree! {
163+
"root" => {
164+
"a" => {
165+
"child 1",
166+
},
167+
"b" => {
168+
"child 2",
169+
},
170+
}
171+
};
172+
173+
let repr = format!("{tree}");
174+
let expected = "root\n a\n child 1\n b\n child 2\n";
175+
176+
assert_eq!(repr, expected);
177+
178+
let tree = tree! {
179+
"root" => {
180+
"a", "b" => {
181+
"x", "y"
182+
}, "c"
183+
}
184+
};
185+
186+
let repr = format!("{tree}");
187+
let expected = "root\n a\n b\n x\n y\n c\n";
188+
189+
assert_eq!(repr, expected);
190+
}

0 commit comments

Comments
 (0)