use std::collections::HashMap as Map;
pub trait NodeContent {
fn new(content: &str) -> Option<Self> where Self: Sized;
fn get_val(&self) -> &str;
fn gen_content(&self) -> String;
}
#[derive(Debug)]
pub struct RawNode {
content: String
}
impl NodeContent for RawNode {
fn new(content: &str) -> Option<Self> {
Some(
Self {
content: String::from(content)
}
)
}
fn get_val(&self) -> &str {
&self.content
}
fn gen_content(&self) -> String {
String::from(self.get_val())
}
}
#[derive(Debug)]
pub struct Node<T: NodeContent = RawNode> {
content: T,
level: usize,
parent_position: Option<usize>,
child_map: Map<String, usize>,
parents_children_pos: Option<usize>,
children: Vec<usize>
}
impl<T: NodeContent> Node<T> {
pub fn new_root(content: &str) -> Option<Self> {
Self::new_node(content, 1)
}
pub fn new_node(content: &str, level: usize) -> Option<Self> {
if let Some(content_node) = NodeContent::new(content) {
Some(
Node {
content: content_node,
level,
parent_position: None,
child_map: Map::new(),
parents_children_pos: None,
children: vec!()
}
)
}
else {
None
}
}
pub fn set_content(&mut self, content: T) {
self.content = content;
}
pub fn get_content(self) -> T {
self.content
}
pub fn get_content_ref(&self) -> &T {
&self.content
}
pub fn set_level(&mut self, level: usize) {
self.level = level;
}
pub fn get_level(&self) -> usize {
self.level
}
pub fn get_num_chuildren(&self) -> usize {
self.children.len()
}
pub fn set_parent_position(&mut self, parent_position: usize) {
self.parent_position = Some(parent_position);
}
pub fn get_parent_position(&self) -> Option<usize> {
self.parent_position
}
pub fn set_parents_children_pos(&mut self, parents_children_pos: usize) {
self.parents_children_pos = Some(parents_children_pos);
}
pub fn get_parents_children_pos(&self) -> Option<usize> {
self.parents_children_pos
}
pub fn add_child(&mut self, node_content: String, node_index: usize) {
self.children.push(node_index);
self.child_map.insert(node_content, node_index);
}
pub fn remove_child(&mut self, node_content: &str, node_index: usize) {
self.child_map.remove(node_content);
self.children[node_index] = usize::MAX;
}
pub fn update_child(&mut self, node_content: &str, new_node_content: &str) -> Option<usize> {
if let Some(node_index) = self.child_map.remove(node_content) {
self.child_map.insert(String::from(new_node_content), node_index);
return Some(node_index);
}
None
}
pub fn get_child(&self, node_content: &str) -> Option<usize> {
if let Some(node_index) = self.child_map.get(node_content) {
Some(*node_index)
}
else {
None
}
}
pub fn get_children_ref(&self) -> &[usize] {
&self.children
}
}