summa-core 0.22.6

Summa Core library
Documentation
use std::sync::Arc;

use crate::configs::{ConfigProxy, ConfigReadProxy, ConfigWriteProxy};
use crate::errors::SummaResult;

#[derive(Clone)]
pub struct PartialProxy<
    TRootConfig: Send + Sync,
    TConfig: Send,
    TPartialFn: Fn(&TRootConfig) -> &TConfig + Send + Sync,
    TPartialFnMut: Fn(&mut TRootConfig) -> &mut TConfig + Send + Sync,
> {
    root_config: Arc<dyn ConfigProxy<TRootConfig>>,
    partial_fn: TPartialFn,
    partial_fn_mut: TPartialFnMut,
}

impl<
        TRootConfig: Send + Sync,
        TConfig: Send,
        TPartialFn: Fn(&TRootConfig) -> &TConfig + Send + Sync,
        TPartialFnMut: Fn(&mut TRootConfig) -> &mut TConfig + Send + Sync,
    > PartialProxy<TRootConfig, TConfig, TPartialFn, TPartialFnMut>
{
    pub fn new(
        root_config: &Arc<dyn ConfigProxy<TRootConfig>>,
        partial_fn: TPartialFn,
        partial_fn_mut: TPartialFnMut,
    ) -> PartialProxy<TRootConfig, TConfig, TPartialFn, TPartialFnMut> {
        PartialProxy {
            root_config: root_config.clone(),
            partial_fn,
            partial_fn_mut,
        }
    }
}

#[async_trait]
impl<
        TRootConfig: Send + Sync,
        TConfig: Send,
        TPartialFn: Fn(&TRootConfig) -> &TConfig + Send + Sync,
        TPartialFnMut: Fn(&mut TRootConfig) -> &mut TConfig + Send + Sync,
    > ConfigProxy<TConfig> for PartialProxy<TRootConfig, TConfig, TPartialFn, TPartialFnMut>
{
    async fn read<'a>(&'a self) -> Box<dyn ConfigReadProxy<TConfig> + 'a> {
        Box::new(PartialReadProxy {
            root_config: self.root_config.read().await,
            partial_fn: &self.partial_fn,
        })
    }

    async fn write<'a>(&'a self) -> Box<dyn ConfigWriteProxy<TConfig> + 'a> {
        Box::new(PartialWriteProxy {
            root_config: self.root_config.write().await,
            partial_fn: &self.partial_fn,
            partial_fn_mut: &self.partial_fn_mut,
        })
    }
}

pub struct PartialReadProxy<'a, TRootConfig: Send + Sync, TConfig: Send, TPartialFn: Fn(&TRootConfig) -> &TConfig + Send + Sync> {
    root_config: Box<dyn ConfigReadProxy<TRootConfig> + 'a>,
    partial_fn: TPartialFn,
}

impl<TRootConfig: Send + Sync, TConfig: Send, TPartialFn: Fn(&TRootConfig) -> &TConfig + Send + Sync> ConfigReadProxy<TConfig>
    for PartialReadProxy<'_, TRootConfig, TConfig, TPartialFn>
{
    fn get(&self) -> &TConfig {
        (self.partial_fn)(self.root_config.get())
    }
}

pub struct PartialWriteProxy<
    'a,
    TRootConfig,
    TConfig: Send,
    TPartialFn: Fn(&TRootConfig) -> &TConfig + Send + Sync,
    TPartialFnMut: Fn(&mut TRootConfig) -> &mut TConfig + Send + Sync,
> {
    root_config: Box<dyn ConfigWriteProxy<TRootConfig> + 'a>,
    partial_fn: TPartialFn,
    partial_fn_mut: TPartialFnMut,
}
#[async_trait]
impl<TRootConfig, TConfig: Send, TPartialFn: Fn(&TRootConfig) -> &TConfig + Send + Sync, TPartialFnMut: Fn(&mut TRootConfig) -> &mut TConfig + Send + Sync>
    ConfigWriteProxy<TConfig> for PartialWriteProxy<'_, TRootConfig, TConfig, TPartialFn, TPartialFnMut>
{
    fn get(&self) -> &TConfig {
        (self.partial_fn)(self.root_config.get())
    }

    fn get_mut(&mut self) -> &mut TConfig {
        (self.partial_fn_mut)(self.root_config.get_mut())
    }

    async fn commit(&self) -> SummaResult<()> {
        self.root_config.commit().await
    }
}