summa_core/configs/
partial_proxy.rs

1use std::sync::Arc;
2
3use crate::configs::{ConfigProxy, ConfigReadProxy, ConfigWriteProxy};
4use crate::errors::SummaResult;
5
6#[derive(Clone)]
7pub struct PartialProxy<
8    TRootConfig: Send + Sync,
9    TConfig: Send,
10    TPartialFn: Fn(&TRootConfig) -> &TConfig + Send + Sync,
11    TPartialFnMut: Fn(&mut TRootConfig) -> &mut TConfig + Send + Sync,
12> {
13    root_config: Arc<dyn ConfigProxy<TRootConfig>>,
14    partial_fn: TPartialFn,
15    partial_fn_mut: TPartialFnMut,
16}
17
18impl<
19        TRootConfig: Send + Sync,
20        TConfig: Send,
21        TPartialFn: Fn(&TRootConfig) -> &TConfig + Send + Sync,
22        TPartialFnMut: Fn(&mut TRootConfig) -> &mut TConfig + Send + Sync,
23    > PartialProxy<TRootConfig, TConfig, TPartialFn, TPartialFnMut>
24{
25    pub fn new(
26        root_config: &Arc<dyn ConfigProxy<TRootConfig>>,
27        partial_fn: TPartialFn,
28        partial_fn_mut: TPartialFnMut,
29    ) -> PartialProxy<TRootConfig, TConfig, TPartialFn, TPartialFnMut> {
30        PartialProxy {
31            root_config: root_config.clone(),
32            partial_fn,
33            partial_fn_mut,
34        }
35    }
36}
37
38#[async_trait]
39impl<
40        TRootConfig: Send + Sync,
41        TConfig: Send,
42        TPartialFn: Fn(&TRootConfig) -> &TConfig + Send + Sync,
43        TPartialFnMut: Fn(&mut TRootConfig) -> &mut TConfig + Send + Sync,
44    > ConfigProxy<TConfig> for PartialProxy<TRootConfig, TConfig, TPartialFn, TPartialFnMut>
45{
46    async fn read<'a>(&'a self) -> Box<dyn ConfigReadProxy<TConfig> + 'a> {
47        Box::new(PartialReadProxy {
48            root_config: self.root_config.read().await,
49            partial_fn: &self.partial_fn,
50        })
51    }
52
53    async fn write<'a>(&'a self) -> Box<dyn ConfigWriteProxy<TConfig> + 'a> {
54        Box::new(PartialWriteProxy {
55            root_config: self.root_config.write().await,
56            partial_fn: &self.partial_fn,
57            partial_fn_mut: &self.partial_fn_mut,
58        })
59    }
60}
61
62pub struct PartialReadProxy<'a, TRootConfig: Send + Sync, TConfig: Send, TPartialFn: Fn(&TRootConfig) -> &TConfig + Send + Sync> {
63    root_config: Box<dyn ConfigReadProxy<TRootConfig> + 'a>,
64    partial_fn: TPartialFn,
65}
66
67impl<TRootConfig: Send + Sync, TConfig: Send, TPartialFn: Fn(&TRootConfig) -> &TConfig + Send + Sync> ConfigReadProxy<TConfig>
68    for PartialReadProxy<'_, TRootConfig, TConfig, TPartialFn>
69{
70    fn get(&self) -> &TConfig {
71        (self.partial_fn)(self.root_config.get())
72    }
73}
74
75pub struct PartialWriteProxy<
76    'a,
77    TRootConfig,
78    TConfig: Send,
79    TPartialFn: Fn(&TRootConfig) -> &TConfig + Send + Sync,
80    TPartialFnMut: Fn(&mut TRootConfig) -> &mut TConfig + Send + Sync,
81> {
82    root_config: Box<dyn ConfigWriteProxy<TRootConfig> + 'a>,
83    partial_fn: TPartialFn,
84    partial_fn_mut: TPartialFnMut,
85}
86#[async_trait]
87impl<TRootConfig, TConfig: Send, TPartialFn: Fn(&TRootConfig) -> &TConfig + Send + Sync, TPartialFnMut: Fn(&mut TRootConfig) -> &mut TConfig + Send + Sync>
88    ConfigWriteProxy<TConfig> for PartialWriteProxy<'_, TRootConfig, TConfig, TPartialFn, TPartialFnMut>
89{
90    fn get(&self) -> &TConfig {
91        (self.partial_fn)(self.root_config.get())
92    }
93
94    fn get_mut(&mut self) -> &mut TConfig {
95        (self.partial_fn_mut)(self.root_config.get_mut())
96    }
97
98    async fn commit(&self) -> SummaResult<()> {
99        self.root_config.commit().await
100    }
101}