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