Skip to main content

actix_web_admin/
registry.rs

1use crate::resource::AdminResource;
2use std::collections::HashMap;
3use std::sync::Arc;
4
5/// Registry of all admin resources.
6pub struct AdminRegistry {
7    resources: HashMap<String, Arc<dyn AdminResource>>,
8    order: Vec<String>,
9}
10
11impl AdminRegistry {
12    /// Create a new empty registry.
13    pub fn new() -> Self {
14        Self {
15            resources: HashMap::new(),
16            order: Vec::new(),
17        }
18    }
19
20    /// Register a resource. Panics if a resource with the same slug already exists.
21    pub fn register<R: AdminResource>(&mut self, resource: R) {
22        let slug = resource.slug().to_string();
23        if self.resources.contains_key(&slug) {
24            panic!("Resource with slug {} already registered", slug);
25        }
26        self.resources.insert(slug.clone(), Arc::new(resource));
27        self.order.push(slug);
28    }
29
30    /// Get a resource by its slug.
31    pub fn get(&self, slug: &str) -> Option<Arc<dyn AdminResource>> {
32        self.resources.get(slug).cloned()
33    }
34
35    /// Get all registered resources in the order they were registered.
36    pub fn all(&self) -> Vec<Arc<dyn AdminResource>> {
37        self.order
38            .iter()
39            .filter_map(|slug| self.resources.get(slug).cloned())
40            .collect()
41    }
42}
43
44pub type SharedRegistry = Arc<AdminRegistry>;