dav_server/
tree.rs

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)]
10/// A tree contains a bunch of nodes.
11pub struct Tree<K: Eq + Hash, D> {
12    nodes: HashMap<u64, Node<K, D>>,
13    node_id: u64,
14}
15
16/// id of the root node of the tree.
17pub const ROOT_ID: u64 = 1;
18
19#[derive(Debug)]
20/// Node itself. "data" contains user-modifiable data.
21pub 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)]
30// Iterator over the children of a node.
31pub struct Children<K>(std::vec::IntoIter<(K, u64)>);
32
33impl<K: Eq + Hash + Debug + Clone, D: Debug> Tree<K, D> {
34    /// Get new tree and initialize the root with 'data'.
35    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    /// add a child node to an existing node.
58    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    /*
73     * unused ...
74    pub fn remove_child(&mut self, parent: u64, key: &K) -> FsResult<()> {
75        let id = {
76            let pnode = self.nodes.get(&parent).ok_or(FsError::NotFound)?;
77            let id = *pnode.children.get(key).ok_or(FsError::NotFound)?;
78            let node = self.nodes.get(&id).unwrap();
79            if node.children.len() > 0 {
80                return Err(FsError::Forbidden);
81            }
82            id
83        };
84        {
85            let pnode = self.nodes.get_mut(&parent).unwrap();
86            pnode.children.remove(key);
87        }
88        self.nodes.remove(&id);
89        Ok(())
90    }*/
91
92    /// Get a child node by key K.
93    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    /// Get all children of this node. Returns an iterator over <K, D>.
104    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    /// Get reference to a node.
114    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    /// Get mutable reference to a node.
120    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    /// Delete a node. Fails if node has children. Returns node itself.
145    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    /// Delete a subtree.
157    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    /// Move a node to a new position and new name in the tree.
169    /// If "overwrite" is true, will replace an existing
170    /// node, but only if it doesn't have any children.
171    #[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}