1use crate::{
2 Options, OptionsCache, OptionsFactory, OptionsMonitorCache, OptionsSnapshot, Ref, Value,
3};
4
5pub struct OptionsManager<T: Value> {
7 factory: Ref<dyn OptionsFactory<T>>,
8 cache: OptionsCache<T>,
9}
10
11impl<T: Value> OptionsManager<T> {
12 pub fn new(factory: Ref<dyn OptionsFactory<T>>) -> Self {
18 Self {
19 factory,
20 cache: Default::default(),
21 }
22 }
23}
24
25unsafe impl<T: Send + Sync> Send for OptionsManager<T> {}
26unsafe impl<T: Send + Sync> Sync for OptionsManager<T> {}
27
28impl<T: Value> Options<T> for OptionsManager<T> {
29 fn value(&self) -> Ref<T> {
30 self.get(None)
31 }
32}
33
34impl<T: Value> OptionsSnapshot<T> for OptionsManager<T> {
35 fn get(&self, name: Option<&str>) -> Ref<T> {
36 self.cache
37 .get_or_add(name, &|n| self.factory.create(n).unwrap())
38 }
39}