use std::collections::{hash_map::{Entry,Iter, IterMut}, HashMap};
use serde::{Serialize,Deserialize};
#[derive(Debug,Serialize,Deserialize,PartialEq, Eq,Clone)]
pub struct Category {
#[serde(default)]
pub yaml_option: Vec<String>,
#[serde(default)]
pub hidden: bool
}
#[derive(Debug,Serialize,Deserialize,PartialEq, Eq,Clone,Default)]
pub struct Categories{
#[serde(flatten)]
content: HashMap<String,Category>
}
impl Categories{
pub fn new()->Self{
Categories { content: HashMap::new() }
}
pub fn add(&mut self, name: String,c: Category){
self.content.insert(name, c);
}
pub fn get(&self, name: &str)->Option<&Category>{
self.content.get(name)
}
pub fn entry<'a>(&'a mut self,name: String)->Entry<'a,String,Category>{
self.content.entry(name)
}
pub fn iter<'a>(&'a self)->Iter<'a,String,Category>{
self.content.iter()
}
pub fn iter_mut<'a>(&'a mut self)->IterMut<'a, String,Category>{
self.content.iter_mut()
}
}
impl IntoIterator for Categories{
type Item = (String,Category);
type IntoIter = <HashMap<String, Category> as IntoIterator>::IntoIter;
fn into_iter(self) -> Self::IntoIter {
self.content.into_iter()
}
}
impl Categories{
pub fn with_category(mut self,name: String,c:Category)->Self{
self.add(name, c);
self
}
pub fn builder()->Self{
Self::new()
}
}