use std::borrow::Borrow;
use std::collections::HashMap;
use std::fmt::Debug;
use std::hash::Hash;
use crate::FsError;
use crate::FsResult;
#[derive(Debug)]
pub struct Tree<K: Eq + Hash, D> {
nodes: HashMap<u64, Node<K, D>>,
node_id: u64,
}
pub const ROOT_ID: u64 = 1;
#[derive(Debug)]
pub struct Node<K: Eq + Hash, D> {
pub data: D,
#[allow(dead_code)]
id: u64,
parent_id: u64,
children: HashMap<K, u64>,
}
#[derive(Debug)]
pub struct Children<K>(std::vec::IntoIter<(K, u64)>);
impl<K: Eq + Hash + Debug + Clone, D: Debug> Tree<K, D> {
pub fn new(data: D) -> Tree<K, D> {
let mut t = Tree {
nodes: HashMap::new(),
node_id: ROOT_ID,
};
t.new_node(99999999, data);
t
}
fn new_node(&mut self, parent: u64, data: D) -> u64 {
let id = self.node_id;
self.node_id += 1;
let node = Node {
id,
parent_id: parent,
data,
children: HashMap::new(),
};
self.nodes.insert(id, node);
id
}
pub fn add_child(&mut self, parent: u64, key: K, data: D, overwrite: bool) -> FsResult<u64> {
{
let pnode = self.nodes.get(&parent).ok_or(FsError::NotFound)?;
if !overwrite && pnode.children.contains_key(&key) {
return Err(FsError::Exists);
}
}
let id = self.new_node(parent, data);
let pnode = self.nodes.get_mut(&parent).unwrap();
pnode.children.insert(key, id);
Ok(id)
}
pub fn get_child<Q>(&self, parent: u64, key: &Q) -> FsResult<u64>
where
K: Borrow<Q>,
Q: Hash + Eq + ?Sized,
{
let pnode = self.nodes.get(&parent).ok_or(FsError::NotFound)?;
let id = pnode.children.get(key).ok_or(FsError::NotFound)?;
Ok(*id)
}
pub fn get_children(&self, parent: u64) -> FsResult<Children<K>> {
let pnode = self.nodes.get(&parent).ok_or(FsError::NotFound)?;
let mut v = Vec::new();
for (k, i) in &pnode.children {
v.push(((*k).clone(), *i));
}
Ok(Children(v.into_iter()))
}
pub fn get_node(&self, id: u64) -> FsResult<&D> {
let n = self.nodes.get(&id).ok_or(FsError::NotFound)?;
Ok(&n.data)
}
pub fn get_node_mut(&mut self, id: u64) -> FsResult<&mut D> {
let n = self.nodes.get_mut(&id).ok_or(FsError::NotFound)?;
Ok(&mut n.data)
}
fn delete_node_from_parent(&mut self, id: u64) -> FsResult<()> {
let parent_id = self.nodes.get(&id).ok_or(FsError::NotFound)?.parent_id;
let key = {
let pnode = self.nodes.get(&parent_id).unwrap();
let mut key = None;
for (k, i) in &pnode.children {
if i == &id {
key = Some((*k).clone());
break;
}
}
key
};
let key = key.unwrap();
let pnode = self.nodes.get_mut(&parent_id).unwrap();
pnode.children.remove(&key);
Ok(())
}
pub fn delete_node(&mut self, id: u64) -> FsResult<Node<K, D>> {
{
let n = self.nodes.get(&id).ok_or(FsError::NotFound)?;
if !n.children.is_empty() {
return Err(FsError::Forbidden);
}
}
self.delete_node_from_parent(id)?;
Ok(self.nodes.remove(&id).unwrap())
}
pub fn delete_subtree(&mut self, id: u64) -> FsResult<()> {
let children = {
let n = self.nodes.get(&id).ok_or(FsError::NotFound)?;
n.children.iter().map(|(_, &v)| v).collect::<Vec<u64>>()
};
for c in children.into_iter() {
self.delete_subtree(c)?;
}
self.delete_node_from_parent(id)
}
#[cfg(feature = "memfs")]
pub fn move_node(
&mut self,
id: u64,
new_parent: u64,
new_name: K,
overwrite: bool,
) -> FsResult<()> {
let dest = {
let pnode = self.nodes.get(&new_parent).ok_or(FsError::NotFound)?;
if let Some(cid) = pnode.children.get(&new_name) {
let cnode = self.nodes.get(cid).unwrap();
if !overwrite || !cnode.children.is_empty() {
return Err(FsError::Exists);
}
Some(*cid)
} else {
None
}
};
self.delete_node_from_parent(id)?;
self.nodes.get_mut(&id).unwrap().parent_id = new_parent;
if let Some(dest) = dest {
self.nodes.remove(&dest);
}
let pnode = self.nodes.get_mut(&new_parent).unwrap();
pnode.children.insert(new_name, id);
Ok(())
}
}
impl<K> Iterator for Children<K> {
type Item = (K, u64);
fn next(&mut self) -> Option<Self::Item> {
self.0.next()
}
}