use crate::export::Export; use hashbrown::{hash_map::Entry, HashMap}; pub trait LikeNamespace { fn get_export(&mut self, name: &str) -> Option; } pub struct ImportObject { map: HashMap>, } impl ImportObject { pub fn new() -> Self { Self { map: HashMap::new(), } } pub fn register(&mut self, name: S, namespace: N) -> Option> where S: Into, N: LikeNamespace + 'static, { match self.map.entry(name.into()) { Entry::Vacant(empty) => { empty.insert(Box::new(namespace)); None } Entry::Occupied(mut occupied) => Some(occupied.insert(Box::new(namespace))), } } pub fn get_namespace(&mut self, namespace: &str) -> Option<&mut (dyn LikeNamespace + 'static)> { self.map .get_mut(namespace) .map(|namespace| &mut **namespace) } } pub struct Namespace { map: HashMap, } impl Namespace { pub fn new() -> Self { Self { map: HashMap::new(), } } pub fn insert(&mut self, name: impl Into, export: Export) -> Option { self.map.insert(name.into(), export) } } impl LikeNamespace for Namespace { fn get_export(&mut self, name: &str) -> Option { self.map.get(name).cloned() } }