display_node/implementations/
tree.rs1use std::{
2 fmt::Display,
3 slice::{Iter, IterMut},
4};
5
6use crate::DisplayableNode;
7
8pub struct Tree<D> {
9 data: D,
10 children: Vec<Tree<D>>,
11}
12
13impl<D> Tree<D> {
14 pub fn new(data: D) -> Self {
15 Self {
16 data,
17 children: vec![],
18 }
19 }
20
21 pub fn assemble(data: D, children: Vec<Self>) -> Self {
22 Self { data, children }
23 }
24
25 pub fn data_ref(&self) -> &D {
26 &self.data
27 }
28
29 pub fn data_mut(&mut self) -> &mut D {
30 &mut self.data
31 }
32
33 pub fn push(&mut self, data: Tree<D>) {
34 self.children.push(data)
35 }
36
37 pub fn pull(&mut self) -> Option<Tree<D>> {
38 if self.children.is_empty() {
39 return None;
40 }
41 let last_index = self.children.len() - 1;
42 let child = self.children.remove(last_index);
43 Some(child)
44 }
45
46 pub fn get_child(&self, index: usize) -> Option<&Tree<D>> {
47 self.children.get(index)
48 }
49
50 pub fn get_child_mut(&mut self, index: usize) -> Option<&mut Tree<D>> {
51 self.children.get_mut(index)
52 }
53
54 pub fn children_ref(&self) -> Iter<'_, Tree<D>> {
55 self.children.iter()
56 }
57
58 pub fn children_mut(&mut self) -> IterMut<'_, Tree<D>> {
59 self.children.iter_mut()
60 }
61
62 pub fn insert(&mut self, _index: usize) {
63 todo!()
64 }
65
66 pub fn take(&mut self, _index: usize) {
67 todo!()
68 }
69}
70
71impl<D: Display> DisplayableNode for Tree<D> {
72 fn label(&self) -> Option<String> {
73 let data = &self.data;
74 Some(format!("{data}"))
75 }
76
77 fn children(&self) -> Vec<&Self> {
78 self.children_ref().collect()
79 }
80}
81
82#[macro_export]
83macro_rules! tree {
84 ($value:expr, $children:expr) => {{
85 Tree::assemble($value, $children)
86 }};
87 ($value:expr) => {{
88 Tree::new($value)
89 }};
90}
91
92#[test]
93fn it_works() {
94 let tree = tree!(
95 "root",
96 vec![
97 tree!(
98 "folder-1",
99 vec![
100 tree!("file-1-1"),
101 tree!("file-1-2"),
102 tree!("file-1-3"),
103 tree!("file-1-4")
104 ]
105 ),
106 tree!(
107 "folder-2",
108 vec![
109 tree!(
110 "folder-2-1",
111 vec![tree!("file-2-1-1"), tree!("file-2-1-2"),]
112 ),
113 tree!("file-2-1"),
114 tree!("file-2-2"),
115 ]
116 )
117 ]
118 );
119 println!("{}", tree.display());
120}