use crate::resource::AdminResource;
use std::collections::HashMap;
use std::sync::Arc;
pub struct AdminRegistry {
resources: HashMap<String, Arc<dyn AdminResource>>,
order: Vec<String>,
}
impl AdminRegistry {
pub fn new() -> Self {
Self {
resources: HashMap::new(),
order: Vec::new(),
}
}
pub fn register<R: AdminResource>(&mut self, resource: R) {
let slug = resource.slug().to_string();
if self.resources.contains_key(&slug) {
panic!("Resource with slug {} already registered", slug);
}
self.resources.insert(slug.clone(), Arc::new(resource));
self.order.push(slug);
}
pub fn get(&self, slug: &str) -> Option<Arc<dyn AdminResource>> {
self.resources.get(slug).cloned()
}
pub fn all(&self) -> Vec<Arc<dyn AdminResource>> {
self.order
.iter()
.filter_map(|slug| self.resources.get(slug).cloned())
.collect()
}
}
pub type SharedRegistry = Arc<AdminRegistry>;