use std::collections::HashMap;
pub struct NamedObjectStore<T> {
lookup: HashMap<String, T>,
default: Option<String>,
}
impl<T> Default for NamedObjectStore<T> {
fn default() -> Self {
NamedObjectStore {
lookup: HashMap::new(),
default: None,
}
}
}
impl<T> NamedObjectStore<T> {
pub fn add(&mut self, name: &str, ds: T) {
self.lookup.insert(name.to_string(), ds);
self.default.get_or_insert(name.to_string());
}
pub fn get(&self, name: &str) -> Option<&T> {
self.lookup.get(name)
}
pub fn get_mut(&mut self, name: &str) -> Option<&mut T> {
self.lookup.get_mut(name)
}
pub fn get_default(&self) -> Option<&T> {
let no_default = "".to_string();
let name = self.default.as_ref().unwrap_or(&no_default);
self.get(name)
}
pub fn get_default_mut(&mut self) -> Option<&mut T> {
let no_default = "".to_string();
let name = self.default.as_ref().unwrap_or(&no_default).clone();
self.get_mut(&name)
}
pub fn get_or_default(&self, name: Option<&str>) -> Option<&T> {
if let Some(name) = name {
self.get(name)
} else {
self.get_default()
}
}
pub fn get_or_default_mut(&mut self, name: Option<&str>) -> Option<&mut T> {
if let Some(name) = name {
self.get_mut(name)
} else {
self.get_default_mut()
}
}
}