options/
manager.rs

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