summa_core/configs/
partial_proxy.rs1use 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}