Skip to main content

fakecloud_core/
registry.rs

1use crate::service::AwsService;
2use std::collections::HashMap;
3use std::sync::Arc;
4
5/// Registry of AWS services available in this FakeCloud instance.
6#[derive(Default)]
7pub struct ServiceRegistry {
8    services: HashMap<String, Arc<dyn AwsService>>,
9}
10
11impl ServiceRegistry {
12    pub fn new() -> Self {
13        Self::default()
14    }
15
16    pub fn register(&mut self, service: Arc<dyn AwsService>) {
17        self.services
18            .insert(service.service_name().to_string(), service);
19    }
20
21    pub fn get(&self, name: &str) -> Option<&Arc<dyn AwsService>> {
22        self.services.get(name)
23    }
24
25    pub fn service_names(&self) -> Vec<&str> {
26        self.services.keys().map(|s| s.as_str()).collect()
27    }
28
29    /// Partition registered services into `(iam_enforceable, not
30    /// enforceable)` lists, sorted alphabetically within each group. Used
31    /// by main.rs to emit the startup log when IAM enforcement is on.
32    pub fn iam_enforcement_split(&self) -> (Vec<&str>, Vec<&str>) {
33        let mut enforced: Vec<&str> = Vec::new();
34        let mut skipped: Vec<&str> = Vec::new();
35        for (name, service) in &self.services {
36            if service.iam_enforceable() {
37                enforced.push(name.as_str());
38            } else {
39                skipped.push(name.as_str());
40            }
41        }
42        enforced.sort();
43        skipped.sort();
44        (enforced, skipped)
45    }
46}