Skip to main content

options/
manager.rs

1use crate::{Options, OptionsCache, OptionsFactory, OptionsMonitorCache, OptionsSnapshot, Ref, Value};
2
3/// Represents an object that manages [`Options`](crate::Options) and [option snapshots](crate::OptionsSnapshot).
4pub struct OptionsManager<T: Value> {
5    factory: Ref<dyn OptionsFactory<T>>,
6    cache: OptionsCache<T>,
7}
8
9impl<T: Value> OptionsManager<T> {
10    /// Initializes a new options manager.
11    ///
12    /// # Arguments
13    ///
14    /// * `factory` - The [factory](crate::OptionsFactory) used to create new options.
15    #[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}