core_dev/collections/
tree.rs1type NodesOption = Option<Vec<TreeNode>>;
5
6pub struct TreeNode {
7 pub name: String,
8 pub path: String,
9 pub nodes: NodesOption,
10}
11
12impl PartialEq for TreeNode {
13 fn eq(&self, other: &Self) -> bool {
14 self.name == other.name
15 }
16}
17
18impl TreeNode {
19 pub fn new(
20 name: String,
21 path: String,
22 nodes: NodesOption,
23 ) -> Self {
24 Self {
25 name,
26 path,
27 nodes,
28 }
29 }
30
31 pub fn find_node(&mut self, name: &str) -> Option<&mut TreeNode> {
32 if let Some(nodes) = &mut self.nodes {
33 for node in nodes.iter_mut() {
34 if node.name == name {
35 return Some(node);
36 }
37 }
38 }
39 None
40 }
41
42 pub fn print_children(&self, level: u32) {
43 let indent = " ".repeat(level as usize);
44 println!("{}Node:", indent);
45 println!("{} value: {}", indent, self.name);
46 println!("{} children:", indent);
47 if let Some(children) = &self.nodes {
48 for ch in children {
49 println!(" {}", ch.name);
50 match &ch.nodes {
51 Some(nodes) => {
52 for node in nodes {
53 node.print_children(level + 2);
54 }
55 },
56 None => {},
57 }
58 }
59 }
60 }
61
62 pub fn add_node(&mut self, node: TreeNode) {
63 if let Some(children) = &mut self.nodes {
64 children.push(node);
65 }
66 }
67
68 pub fn add_nodes(&mut self, nodes: Vec<TreeNode>) {
69 if let Some(children) = &mut self.nodes {
70 for (ch, node) in
71 children.iter_mut().zip(nodes.into_iter())
72 {
73 match &mut ch.nodes {
74 Some(ch_nodes) => {
75 ch_nodes.push(node);
76 },
77 None => {},
78 }
79 }
80 }
81 }
82
83 pub fn sort_nodes_alphabetically(head: &mut TreeNode) {
84 if let Some(nodes) = &mut head.nodes {
85 for node in nodes.iter_mut() {
86 TreeNode::sort_nodes_alphabetically(node);
87 }
88 nodes.sort_by(|n1, n2| n1.name.cmp(&n2.name))
89 }
90 }
91
92 fn _generate_summary(&self, level: usize) -> Vec<String> {
93 let mut result = Vec::new();
94 let indent = " ".repeat(level);
95 let line =
96 format!("{}- [{}]({})", indent, self.name, self.path);
97 result.push(line);
99
100 if let Some(nodes) = &self.nodes {
101 for node in nodes {
102 let indent = " ".repeat(level + 1);
103 let line = format!(
104 "{}- [{}]({})",
105 indent, node.name, node.path
106 );
107 result.push(line);
109
110 match &node.nodes {
111 Some(nodes) => {
112 for node in nodes {
113 result.extend(
114 node._generate_summary(level + 2),
115 );
116 }
117 },
118 None => {},
119 }
120 }
121 }
122 result
123 }
124
125 pub fn generate_summary(&self, level: usize) -> Vec<String> {
126 let mut summary_vec =
127 vec!["# Summary".to_string(), "".to_string()];
128 if let Some(nodes) = &self.nodes {
129 for node in nodes {
130 summary_vec.extend(node._generate_summary(level));
131 }
132 }
133 summary_vec
134 }
135
136 pub fn generate_summary_string(&self) -> String {
137 let mut summary_string = String::new();
138 let summary = self.generate_summary(0);
139 for line in summary.iter() {
140 let ll = line.clone() + "\n";
141 summary_string.push_str(&ll);
142 }
143 summary_string
144 }
145}