use std::{any::Any, collections::HashMap, hash::Hash};
pub struct Dict<T> {
pub(self) inner: HashMap<T, Box<dyn Any>>,
}
impl<T> Dict<T>
where
T: Eq + PartialEq + Hash,
{
pub fn new() -> Self {
Dict {
inner: HashMap::new(),
}
}
pub fn insert<U: 'static>(&mut self, key: T, hole: U) {
self.inner.insert(key, Box::new(hole));
}
pub fn get<U: 'static>(&self, key: T) -> Result<&U, DictError> {
match self.inner.get(&key) {
Some(boxed_value) => match boxed_value.as_ref().downcast_ref::<U>() {
Some(value) => Ok(value),
None => Err(DictError::FailedCasting),
},
None => Err(DictError::KeyNotFound),
}
}
pub fn get_mut<U: 'static>(&mut self, key: T) -> Result<&mut U, DictError> {
match self.inner.get_mut(&key) {
Some(boxed_value) => match boxed_value.as_mut().downcast_mut::<U>() {
Some(value) => Ok(value),
None => Err(DictError::FailedCasting),
},
None => Err(DictError::KeyNotFound),
}
}
}
#[derive(Debug)]
pub enum DictError {
KeyNotFound,
FailedCasting,
}