actix_web_admin/
registry.rs1use crate::resource::AdminResource;
2use std::collections::HashMap;
3use std::sync::Arc;
4
5pub struct AdminRegistry {
7 resources: HashMap<String, Arc<dyn AdminResource>>,
8 order: Vec<String>,
9}
10
11impl AdminRegistry {
12 pub fn new() -> Self {
14 Self {
15 resources: HashMap::new(),
16 order: Vec::new(),
17 }
18 }
19
20 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 pub fn get(&self, slug: &str) -> Option<Arc<dyn AdminResource>> {
32 self.resources.get(slug).cloned()
33 }
34
35 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>;