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())
}
|