summaryrefslogtreecommitdiff
path: root/plugins/warp/src/cache/container.rs
blob: 99746d9acaeef2f5095bf25ad8fd11e5c92f5cb8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use crate::container::Container;
use dashmap::DashMap;
use std::ops::Deref;
use std::sync::{Arc, OnceLock, RwLock};

pub static CONTAINER_CACHE: OnceLock<DashMap<String, Arc<RwLock<Box<dyn Container>>>>> =
    OnceLock::new();

pub fn for_cached_containers(f: impl Fn(&dyn Container)) {
    let containers_cache = CONTAINER_CACHE.get_or_init(Default::default);
    for container in containers_cache.iter() {
        if let Ok(guarded_container) = container.read() {
            f(guarded_container.deref().as_ref());
        }
    }
}

pub fn for_cached_containers_mut(f: impl Fn(&mut dyn Container)) {
    let containers_cache = CONTAINER_CACHE.get_or_init(Default::default);
    for container in containers_cache.iter() {
        if let Ok(mut guarded_container) = container.write() {
            f(guarded_container.as_mut());
        }
    }
}

// TODO: The static lifetime here is a little wierd... (we need it to Box)
pub fn add_cached_container(container: impl Container + 'static) {
    let containers_cache = CONTAINER_CACHE.get_or_init(Default::default);
    let container_name = container.to_string();
    containers_cache.insert(container_name, Arc::new(RwLock::new(Box::new(container))));
}

pub fn cached_containers() -> Vec<Arc<RwLock<Box<dyn Container>>>> {
    let containers_cache = CONTAINER_CACHE.get_or_init(Default::default);
    containers_cache.iter().map(|c| c.clone()).collect()
}

pub fn cached_container_by_name(name: &str) -> Option<Arc<RwLock<Box<dyn Container>>>> {
    let containers_cache = CONTAINER_CACHE.get_or_init(Default::default);
    containers_cache.get(name).map(|c| c.clone())
}