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
use crate::{Options, OptionsCache, OptionsFactory, OptionsMonitorCache, OptionsSnapshot, Ref};
pub struct OptionsManager<T> {
factory: Ref<dyn OptionsFactory<T>>,
cache: OptionsCache<T>,
}
impl<T> OptionsManager<T> {
pub fn new(factory: Ref<dyn OptionsFactory<T>>) -> Self {
Self {
factory,
cache: Default::default(),
}
}
}
impl<T> Options<T> for OptionsManager<T> {
fn value(&self) -> &T {
self.get(None)
}
}
impl<T> OptionsSnapshot<T> for OptionsManager<T> {
fn get(&self, name: Option<&str>) -> &T {
self.cache.get_or_add(name, &|n| self.factory.create(n).unwrap())
}
}