display_node/implementations/
tree.rs

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