1use serde::{ser::Serialize as SerTrait, Deserialize, Serialize};
2use std::cell::RefCell;
3use std::fmt;
4use std::fs;
5use std::rc::{Rc, Weak};
6use uuid::Uuid;
7
8type NodeRef = Rc<RefCell<TreeNodeInner>>;
10type WeakNodeRef = Weak<RefCell<TreeNodeInner>>;
11
12#[derive(Debug, Clone)]
13struct TreeNodeInner {
14 pub guid: Uuid,
15 pub name: String,
16 children: Vec<NodeRef>,
17 parent: Option<WeakNodeRef>,
18 tree: Option<Weak<RefCell<Tree>>>,
19}
20
21#[derive(Debug, Clone)]
23pub struct TreeNode {
24 inner: NodeRef,
25}
26
27impl PartialEq for TreeNode {
28 fn eq(&self, other: &Self) -> bool {
29 Rc::ptr_eq(&self.inner, &other.inner)
30 }
31}
32
33#[derive(Serialize, Deserialize)]
34#[serde(tag = "type", rename = "TreeNode")]
35struct TreeNodeSerde {
36 guid: Uuid,
37 name: String,
38 children: Vec<TreeNodeSerde>,
39}
40
41impl TreeNode {
42 pub fn new(name: &str) -> Self {
43 Self {
44 inner: Rc::new(RefCell::new(TreeNodeInner {
45 guid: Uuid::new_v4(),
46 name: name.to_string(),
47 children: Vec::new(),
48 parent: None,
49 tree: None,
50 })),
51 }
52 }
53
54 pub fn name(&self) -> String {
55 self.inner.borrow().name.clone()
56 }
57
58 pub fn guid(&self) -> Uuid {
59 self.inner.borrow().guid
60 }
61
62 pub fn add(&self, child: &TreeNode) {
63 child.inner.borrow_mut().parent = Some(Rc::downgrade(&self.inner));
64 child.inner.borrow_mut().tree = self.inner.borrow().tree.clone();
65 self.inner.borrow_mut().children.push(child.inner.clone());
66 }
67
68 pub fn remove(&self, child: &TreeNode) -> bool {
69 let child_guid = child.guid();
70 let mut inner = self.inner.borrow_mut();
71 if let Some(pos) = inner
72 .children
73 .iter()
74 .position(|c| c.borrow().guid == child_guid)
75 {
76 let removed = inner.children.remove(pos);
77 removed.borrow_mut().parent = None;
78 true
79 } else {
80 false
81 }
82 }
83
84 pub fn parent(&self) -> Option<TreeNode> {
85 self.inner
86 .borrow()
87 .parent
88 .as_ref()?
89 .upgrade()
90 .map(|inner| TreeNode { inner })
91 }
92
93 pub fn children(&self) -> Vec<TreeNode> {
94 self.inner
95 .borrow()
96 .children
97 .iter()
98 .map(|child| TreeNode {
99 inner: Rc::clone(child),
100 })
101 .collect()
102 }
103
104 pub fn is_root(&self) -> bool {
105 self.inner.borrow().parent.is_none()
106 }
107
108 pub fn is_leaf(&self) -> bool {
109 self.inner.borrow().children.is_empty()
110 }
111
112 pub fn ancestors(&self) -> Vec<TreeNode> {
113 let mut result = Vec::new();
114 let mut current = self.parent();
115
116 while let Some(node) = current {
117 result.push(node.clone());
118 current = node.parent();
119 }
120
121 result
122 }
123
124 pub fn descendants(&self) -> Vec<TreeNode> {
125 let mut result = Vec::new();
126 for child in self.children() {
127 result.push(child.clone());
128 result.extend(child.descendants());
129 }
130 result
131 }
132
133 pub fn nodes(&self) -> Vec<TreeNode> {
134 let mut result = vec![self.clone()];
135 for child in self.children() {
136 result.extend(child.nodes());
137 }
138 result
139 }
140
141 pub fn root(&self) -> TreeNode {
142 if let Some(parent) = self.parent() {
143 parent.root()
144 } else {
145 self.clone()
146 }
147 }
148
149 pub fn traverse(&self, strategy: &str, order: &str) -> Vec<TreeNode> {
150 match strategy {
151 "depthfirst" => self.depth_first_traverse(order),
152 "breadthfirst" => self.breadth_first_traverse(),
153 _ => vec![],
154 }
155 }
156
157 fn depth_first_traverse(&self, order: &str) -> Vec<TreeNode> {
158 match order {
159 "preorder" => self.preorder_traverse(),
160 "postorder" => self.postorder_traverse(),
161 _ => vec![],
162 }
163 }
164
165 fn preorder_traverse(&self) -> Vec<TreeNode> {
166 let mut result = vec![self.clone()];
167 for child in self.children() {
168 result.extend(child.preorder_traverse());
169 }
170 result
171 }
172
173 fn postorder_traverse(&self) -> Vec<TreeNode> {
174 let mut result = Vec::new();
175 for child in self.children() {
176 result.extend(child.postorder_traverse());
177 }
178 result.push(self.clone());
179 result
180 }
181
182 fn breadth_first_traverse(&self) -> Vec<TreeNode> {
183 let mut result = Vec::new();
184 let mut queue = Vec::new();
185
186 queue.push(self.clone());
187
188 while let Some(node) = queue.pop() {
189 result.push(node.clone());
190 for child in node.children() {
191 queue.insert(0, child);
192 }
193 }
194
195 result
196 }
197
198 pub fn to_json_data(&self) -> Result<String, Box<dyn std::error::Error>> {
199 let serde_node = self.to_serde();
200 let mut buf = Vec::new();
201 let formatter = serde_json::ser::PrettyFormatter::with_indent(b" ");
202 let mut ser = serde_json::Serializer::with_formatter(&mut buf, formatter);
203 SerTrait::serialize(&serde_node, &mut ser)?;
204 Ok(String::from_utf8(buf)?)
205 }
206
207 pub fn from_json_data(json_data: &str) -> Result<Self, Box<dyn std::error::Error>> {
208 let serde_node: TreeNodeSerde = serde_json::from_str(json_data)?;
209 Ok(Self::from_serde(serde_node))
210 }
211
212 fn to_serde(&self) -> TreeNodeSerde {
213 let inner = self.inner.borrow();
214 TreeNodeSerde {
215 guid: inner.guid,
216 name: inner.name.clone(),
217 children: inner
218 .children
219 .iter()
220 .map(|child| {
221 TreeNode {
222 inner: Rc::clone(child),
223 }
224 .to_serde()
225 })
226 .collect(),
227 }
228 }
229
230 fn from_serde(serde_node: TreeNodeSerde) -> Self {
231 let node = TreeNode::new(&serde_node.name);
232 node.inner.borrow_mut().guid = serde_node.guid;
233
234 for child_serde in serde_node.children {
235 let child = Self::from_serde(child_serde);
236 node.add(&child);
237 }
238
239 node
240 }
241
242 pub fn to_json(&self, filepath: &str) -> Result<(), Box<dyn std::error::Error>> {
243 let json = self.to_json_data()?;
244 fs::write(filepath, json)?;
245 Ok(())
246 }
247
248 pub fn from_json(filepath: &str) -> Result<Self, Box<dyn std::error::Error>> {
249 let json = fs::read_to_string(filepath)?;
250 Self::from_json_data(&json)
251 }
252}
253
254impl fmt::Display for TreeNode {
255 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
256 let inner = self.inner.borrow();
257 write!(
258 f,
259 "TreeNode({}, {}, {} children)",
260 inner.name,
261 inner.guid,
262 inner.children.len()
263 )
264 }
265}
266
267#[derive(Debug, Clone)]
268pub struct Tree {
269 pub guid: Uuid,
270 pub name: String,
271 root_node: Option<TreeNode>,
272}
273
274#[derive(Serialize, Deserialize)]
275#[serde(tag = "type", rename = "Tree")]
276struct TreeSerde {
277 guid: Uuid,
278 name: String,
279 root: Option<TreeNodeSerde>,
280}
281
282impl Tree {
283 pub fn new(name: &str) -> Self {
284 Self {
285 guid: Uuid::new_v4(),
286 name: name.to_string(),
287 root_node: None,
288 }
289 }
290
291 pub fn root(&self) -> Option<TreeNode> {
292 self.root_node.clone()
293 }
294
295 pub fn add(&mut self, node: &TreeNode, parent: Option<&TreeNode>) {
296 if parent.is_none() {
297 self.root_node = Some(node.clone());
298 } else if let Some(parent_node) = parent {
299 parent_node.add(node);
300 }
301 }
302
303 pub fn nodes(&self) -> Vec<TreeNode> {
304 if let Some(root) = &self.root_node {
305 root.nodes()
306 } else {
307 vec![]
308 }
309 }
310
311 pub fn remove(&mut self, node: &TreeNode) -> bool {
312 if let Some(root) = &self.root_node {
313 let node_guid = node.guid();
314 if root.guid() == node_guid {
315 self.root_node = None;
316 true
317 } else {
318 if let Some(parent) = self.find_parent_of_node(&node_guid) {
320 parent.remove(node)
321 } else {
322 false
323 }
324 }
325 } else {
326 false
327 }
328 }
329
330 fn find_parent_of_node(&self, node_guid: &Uuid) -> Option<TreeNode> {
331 if let Some(root) = &self.root_node {
332 Self::find_parent_recursive(root, node_guid)
333 } else {
334 None
335 }
336 }
337
338 fn find_parent_recursive(node: &TreeNode, target_guid: &Uuid) -> Option<TreeNode> {
339 for child in node.children() {
340 if child.guid() == *target_guid {
341 return Some(node.clone());
342 }
343 if let Some(found) = Self::find_parent_recursive(&child, target_guid) {
344 return Some(found);
345 }
346 }
347 None
348 }
349
350 pub fn leaves(&self) -> Vec<TreeNode> {
351 self.nodes().into_iter().filter(|n| n.is_leaf()).collect()
352 }
353
354 pub fn traverse(&self, strategy: &str, order: &str) -> Vec<TreeNode> {
355 if let Some(root) = &self.root_node {
356 root.traverse(strategy, order)
357 } else {
358 vec![]
359 }
360 }
361
362 pub fn get_node_by_name(&self, node_name: &str) -> Option<TreeNode> {
363 self.nodes().into_iter().find(|n| n.name() == node_name)
364 }
365
366 pub fn get_nodes_by_name(&self, node_name: &str) -> Vec<TreeNode> {
367 self.nodes()
368 .into_iter()
369 .filter(|n| n.name() == node_name)
370 .collect()
371 }
372
373 pub fn find_node_by_guid(&self, node_guid: &Uuid) -> Option<TreeNode> {
374 self.nodes().into_iter().find(|n| n.guid() == *node_guid)
375 }
376
377 pub fn add_child_by_guid(&mut self, parent_guid: &Uuid, child_guid: &Uuid) -> bool {
378 let parent_node = self.find_node_by_guid(parent_guid);
379 let child_node = self.find_node_by_guid(child_guid);
380
381 if let (Some(parent), Some(child)) = (parent_node, child_node) {
382 if let Some(current_parent) = child.parent() {
384 current_parent.remove(&child);
385 }
386
387 parent.add(&child);
389 true
390 } else {
391 false
392 }
393 }
394
395 pub fn get_children_guids(&self, node_guid: &Uuid) -> Vec<Uuid> {
396 if let Some(node) = self.find_node_by_guid(node_guid) {
397 node.children().iter().map(|c| c.guid()).collect()
398 } else {
399 vec![]
400 }
401 }
402
403 pub fn print_hierarchy(&self) {
404 if let Some(root) = &self.root_node {
405 Self::print_node(root, 0);
406 }
407 }
408
409 fn print_node(node: &TreeNode, level: usize) {
410 let indent = " ".repeat(level);
411 println!("{}├── {} ({})", indent, node.name(), node.guid());
412
413 for child in node.children() {
414 Self::print_node(&child, level + 1);
415 }
416 }
417
418 pub fn to_json_data(&self) -> Result<String, Box<dyn std::error::Error>> {
419 let serde_tree = TreeSerde {
420 guid: self.guid,
421 name: self.name.clone(),
422 root: self.root_node.as_ref().map(|r| r.to_serde()),
423 };
424 let mut buf = Vec::new();
425 let formatter = serde_json::ser::PrettyFormatter::with_indent(b" ");
426 let mut ser = serde_json::Serializer::with_formatter(&mut buf, formatter);
427 SerTrait::serialize(&serde_tree, &mut ser)?;
428 Ok(String::from_utf8(buf)?)
429 }
430
431 pub fn from_json_data(json_data: &str) -> Result<Self, Box<dyn std::error::Error>> {
432 let serde_tree: TreeSerde = serde_json::from_str(json_data)?;
433 let mut tree = Tree::new(&serde_tree.name);
434 tree.guid = serde_tree.guid;
435
436 if let Some(root_serde) = serde_tree.root {
437 let root = TreeNode::from_serde(root_serde);
438 tree.root_node = Some(root);
439 }
440
441 Ok(tree)
442 }
443
444 pub fn to_json(&self, filepath: &str) -> Result<(), Box<dyn std::error::Error>> {
445 let json = self.to_json_data()?;
446 fs::write(filepath, json)?;
447 Ok(())
448 }
449
450 pub fn from_json(filepath: &str) -> Result<Self, Box<dyn std::error::Error>> {
451 let json = fs::read_to_string(filepath)?;
452 Self::from_json_data(&json)
453 }
454}
455
456impl fmt::Display for Tree {
457 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
458 write!(f, "Tree({}, {})", self.name, self.guid)
459 }
460}
461
462impl Default for TreeNode {
463 fn default() -> Self {
464 Self::new("my_node")
465 }
466}
467
468impl Default for Tree {
469 fn default() -> Self {
470 Self::new("my_tree")
471 }
472}