1use crate::tree::Tree;
2use serde::{ser::Serialize as SerTrait, Deserialize, Serialize};
3use std::cell::RefCell;
4use std::fmt;
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: String,
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
33impl Serialize for TreeNode {
34 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
35 where
36 S: serde::Serializer,
37 {
38 self.to_serde().serialize(serializer)
39 }
40}
41
42impl<'de> Deserialize<'de> for TreeNode {
43 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
44 where
45 D: serde::Deserializer<'de>,
46 {
47 let serde_repr = TreeNodeSerde::deserialize(deserializer)?;
48 Ok(Self::from_serde(serde_repr))
49 }
50}
51
52#[derive(Serialize, Deserialize)]
53#[serde(tag = "type", rename = "TreeNode")]
54pub(crate) struct TreeNodeSerde {
55 pub guid: String,
56 pub name: String,
57 pub children: Vec<TreeNodeSerde>,
58}
59
60impl TreeNode {
61 pub fn new(name: &str) -> Self {
62 Self {
63 inner: Rc::new(RefCell::new(TreeNodeInner {
64 guid: Uuid::new_v4().to_string(),
65 name: name.to_string(),
66 children: Vec::new(),
67 parent: None,
68 tree: None,
69 })),
70 }
71 }
72
73 pub fn name(&self) -> String {
74 self.inner.borrow().name.clone()
75 }
76
77 pub fn guid(&self) -> String {
78 self.inner.borrow().guid.clone()
79 }
80
81 pub fn add(&self, child: &TreeNode) {
82 child.inner.borrow_mut().parent = Some(Rc::downgrade(&self.inner));
83 child.inner.borrow_mut().tree = self.inner.borrow().tree.clone();
84 self.inner.borrow_mut().children.push(child.inner.clone());
85 }
86
87 pub fn remove(&self, child: &TreeNode) -> bool {
88 let child_guid = child.guid();
89 let mut inner = self.inner.borrow_mut();
90 if let Some(pos) = inner
91 .children
92 .iter()
93 .position(|c| c.borrow().guid == child_guid)
94 {
95 let removed = inner.children.remove(pos);
96 removed.borrow_mut().parent = None;
97 true
98 } else {
99 false
100 }
101 }
102
103 pub fn parent(&self) -> Option<TreeNode> {
104 self.inner
105 .borrow()
106 .parent
107 .as_ref()?
108 .upgrade()
109 .map(|inner| TreeNode { inner })
110 }
111
112 pub fn children(&self) -> Vec<TreeNode> {
113 self.inner
114 .borrow()
115 .children
116 .iter()
117 .map(|child| TreeNode {
118 inner: Rc::clone(child),
119 })
120 .collect()
121 }
122
123 pub fn is_root(&self) -> bool {
124 self.inner.borrow().parent.is_none()
125 }
126
127 pub fn is_leaf(&self) -> bool {
128 self.inner.borrow().children.is_empty()
129 }
130
131 pub fn ancestors(&self) -> Vec<TreeNode> {
132 let mut result = Vec::new();
133 let mut current = self.parent();
134
135 while let Some(node) = current {
136 result.push(node.clone());
137 current = node.parent();
138 }
139
140 result
141 }
142
143 pub fn descendants(&self) -> Vec<TreeNode> {
144 let mut result = Vec::new();
145 for child in self.children() {
146 result.push(child.clone());
147 result.extend(child.descendants());
148 }
149 result
150 }
151
152 pub fn nodes(&self) -> Vec<TreeNode> {
153 let mut result = vec![self.clone()];
154 for child in self.children() {
155 result.extend(child.nodes());
156 }
157 result
158 }
159
160 pub fn root(&self) -> TreeNode {
161 if let Some(parent) = self.parent() {
162 parent.root()
163 } else {
164 self.clone()
165 }
166 }
167
168 pub fn traverse(&self, strategy: &str, order: &str) -> Vec<TreeNode> {
169 match strategy {
170 "depthfirst" => self.depth_first_traverse(order),
171 "breadthfirst" => self.breadth_first_traverse(),
172 _ => vec![],
173 }
174 }
175
176 fn depth_first_traverse(&self, order: &str) -> Vec<TreeNode> {
177 match order {
178 "preorder" => self.preorder_traverse(),
179 "postorder" => self.postorder_traverse(),
180 _ => vec![],
181 }
182 }
183
184 fn preorder_traverse(&self) -> Vec<TreeNode> {
185 let mut result = vec![self.clone()];
186 for child in self.children() {
187 result.extend(child.preorder_traverse());
188 }
189 result
190 }
191
192 fn postorder_traverse(&self) -> Vec<TreeNode> {
193 let mut result = Vec::new();
194 for child in self.children() {
195 result.extend(child.postorder_traverse());
196 }
197 result.push(self.clone());
198 result
199 }
200
201 fn breadth_first_traverse(&self) -> Vec<TreeNode> {
202 let mut result = Vec::new();
203 let mut queue = Vec::new();
204
205 queue.push(self.clone());
206
207 while let Some(node) = queue.pop() {
208 result.push(node.clone());
209 for child in node.children() {
210 queue.insert(0, child);
211 }
212 }
213
214 result
215 }
216
217 pub fn jsondump(&self) -> Result<String, Box<dyn std::error::Error>> {
218 let serde_node = self.to_serde();
219 let mut buf = Vec::new();
220 let formatter = serde_json::ser::PrettyFormatter::with_indent(b" ");
221 let mut ser = serde_json::Serializer::with_formatter(&mut buf, formatter);
222 SerTrait::serialize(&serde_node, &mut ser)?;
223 Ok(String::from_utf8(buf)?)
224 }
225
226 pub fn jsonload(json_data: &str) -> Result<Self, Box<dyn std::error::Error>> {
227 let serde_node: TreeNodeSerde = serde_json::from_str(json_data)?;
228 Ok(Self::from_serde(serde_node))
229 }
230
231 pub(crate) fn to_serde(&self) -> TreeNodeSerde {
232 let inner = self.inner.borrow();
233 TreeNodeSerde {
234 guid: inner.guid.clone(),
235 name: inner.name.clone(),
236 children: inner
237 .children
238 .iter()
239 .map(|child| {
240 TreeNode {
241 inner: Rc::clone(child),
242 }
243 .to_serde()
244 })
245 .collect(),
246 }
247 }
248
249 pub(crate) fn from_serde(serde_node: TreeNodeSerde) -> Self {
250 let node = TreeNode::new(&serde_node.name);
251 node.inner.borrow_mut().guid = serde_node.guid;
252
253 for child_serde in serde_node.children {
254 let child = Self::from_serde(child_serde);
255 node.add(&child);
256 }
257
258 node
259 }
260}
261
262impl fmt::Display for TreeNode {
263 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
264 let inner = self.inner.borrow();
265 write!(
266 f,
267 "TreeNode({}, {}, {} children)",
268 inner.name,
269 inner.guid,
270 inner.children.len()
271 )
272 }
273}
274
275#[cfg(test)]
276#[path = "treenode_test.rs"]
277mod treenode_test;