1use std::borrow::Borrow;
2use std::collections::HashMap;
3use std::fmt::Debug;
4use std::hash::Hash;
5
6use crate::FsError;
7use crate::FsResult;
8
9#[derive(Debug)]
10pub struct Tree<K: Eq + Hash, D> {
12 nodes: HashMap<u64, Node<K, D>>,
13 node_id: u64,
14}
15
16pub const ROOT_ID: u64 = 1;
18
19#[derive(Debug)]
20pub struct Node<K: Eq + Hash, D> {
22 pub data: D,
23 #[allow(dead_code)]
24 id: u64,
25 parent_id: u64,
26 children: HashMap<K, u64>,
27}
28
29#[derive(Debug)]
30pub struct Children<K>(std::vec::IntoIter<(K, u64)>);
32
33impl<K: Eq + Hash + Debug + Clone, D: Debug> Tree<K, D> {
34 pub fn new(data: D) -> Tree<K, D> {
36 let mut t = Tree {
37 nodes: HashMap::new(),
38 node_id: ROOT_ID,
39 };
40 t.new_node(99999999, data);
41 t
42 }
43
44 fn new_node(&mut self, parent: u64, data: D) -> u64 {
45 let id = self.node_id;
46 self.node_id += 1;
47 let node = Node {
48 id,
49 parent_id: parent,
50 data,
51 children: HashMap::new(),
52 };
53 self.nodes.insert(id, node);
54 id
55 }
56
57 pub fn add_child(&mut self, parent: u64, key: K, data: D, overwrite: bool) -> FsResult<u64> {
59 {
60 let pnode = self.nodes.get(&parent).ok_or(FsError::NotFound)?;
61 if !overwrite && pnode.children.contains_key(&key) {
62 return Err(FsError::Exists);
63 }
64 }
65 let id = self.new_node(parent, data);
66 let pnode = self.nodes.get_mut(&parent).unwrap();
67
68 pnode.children.insert(key, id);
69 Ok(id)
70 }
71
72 pub fn get_child<Q>(&self, parent: u64, key: &Q) -> FsResult<u64>
94 where
95 K: Borrow<Q>,
96 Q: Hash + Eq + ?Sized,
97 {
98 let pnode = self.nodes.get(&parent).ok_or(FsError::NotFound)?;
99 let id = pnode.children.get(key).ok_or(FsError::NotFound)?;
100 Ok(*id)
101 }
102
103 pub fn get_children(&self, parent: u64) -> FsResult<Children<K>> {
105 let pnode = self.nodes.get(&parent).ok_or(FsError::NotFound)?;
106 let mut v = Vec::new();
107 for (k, i) in &pnode.children {
108 v.push(((*k).clone(), *i));
109 }
110 Ok(Children(v.into_iter()))
111 }
112
113 pub fn get_node(&self, id: u64) -> FsResult<&D> {
115 let n = self.nodes.get(&id).ok_or(FsError::NotFound)?;
116 Ok(&n.data)
117 }
118
119 pub fn get_node_mut(&mut self, id: u64) -> FsResult<&mut D> {
121 let n = self.nodes.get_mut(&id).ok_or(FsError::NotFound)?;
122 Ok(&mut n.data)
123 }
124
125 fn delete_node_from_parent(&mut self, id: u64) -> FsResult<()> {
126 let parent_id = self.nodes.get(&id).ok_or(FsError::NotFound)?.parent_id;
127 let key = {
128 let pnode = self.nodes.get(&parent_id).unwrap();
129 let mut key = None;
130 for (k, i) in &pnode.children {
131 if i == &id {
132 key = Some((*k).clone());
133 break;
134 }
135 }
136 key
137 };
138 let key = key.unwrap();
139 let pnode = self.nodes.get_mut(&parent_id).unwrap();
140 pnode.children.remove(&key);
141 Ok(())
142 }
143
144 pub fn delete_node(&mut self, id: u64) -> FsResult<Node<K, D>> {
146 {
147 let n = self.nodes.get(&id).ok_or(FsError::NotFound)?;
148 if !n.children.is_empty() {
149 return Err(FsError::Forbidden);
150 }
151 }
152 self.delete_node_from_parent(id)?;
153 Ok(self.nodes.remove(&id).unwrap())
154 }
155
156 pub fn delete_subtree(&mut self, id: u64) -> FsResult<()> {
158 let children = {
159 let n = self.nodes.get(&id).ok_or(FsError::NotFound)?;
160 n.children.iter().map(|(_, &v)| v).collect::<Vec<u64>>()
161 };
162 for c in children.into_iter() {
163 self.delete_subtree(c)?;
164 }
165 self.delete_node_from_parent(id)
166 }
167
168 #[cfg(feature = "memfs")]
172 pub fn move_node(
173 &mut self,
174 id: u64,
175 new_parent: u64,
176 new_name: K,
177 overwrite: bool,
178 ) -> FsResult<()> {
179 let dest = {
180 let pnode = self.nodes.get(&new_parent).ok_or(FsError::NotFound)?;
181 if let Some(cid) = pnode.children.get(&new_name) {
182 let cnode = self.nodes.get(cid).unwrap();
183 if !overwrite || !cnode.children.is_empty() {
184 return Err(FsError::Exists);
185 }
186 Some(*cid)
187 } else {
188 None
189 }
190 };
191 self.delete_node_from_parent(id)?;
192 self.nodes.get_mut(&id).unwrap().parent_id = new_parent;
193 if let Some(dest) = dest {
194 self.nodes.remove(&dest);
195 }
196 let pnode = self.nodes.get_mut(&new_parent).unwrap();
197 pnode.children.insert(new_name, id);
198 Ok(())
199 }
200}
201
202impl<K> Iterator for Children<K> {
203 type Item = (K, u64);
204 fn next(&mut self) -> Option<Self::Item> {
205 self.0.next()
206 }
207}