datasources 0.1.5

Async datasource interfaces, middleware, registry, and test doubles
Documentation
use crate::bulk_crud_repository::BulkCRUDRepository;
use crate::repository::{as_readonly, ICRUDRepository, IReadonlyRepository};
use std::any::Any;
use std::sync::Arc;

pub trait EnrichmentVia {
    fn read_via(self) -> Arc<dyn IReadonlyRepository>
    where
        Self: Sized,
    {
        self.into_repos().0
    }

    fn into_repos(
        self,
    ) -> (
        Arc<dyn IReadonlyRepository>,
        Option<Arc<dyn ICRUDRepository>>,
    );

    fn bulk_repo(&self) -> Option<Arc<BulkCRUDRepository>> {
        None
    }
}

impl<T> EnrichmentVia for Arc<T>
where
    T: IReadonlyRepository + Any + 'static,
{
    fn into_repos(
        self,
    ) -> (
        Arc<dyn IReadonlyRepository>,
        Option<Arc<dyn ICRUDRepository>>,
    ) {
        let write = self.clone().to_crud();
        (self, write)
    }

    fn bulk_repo(&self) -> Option<Arc<BulkCRUDRepository>> {
        let any: Arc<dyn Any + Send + Sync> = self.clone();
        any.downcast::<BulkCRUDRepository>().ok()
    }
}

impl EnrichmentVia for Arc<dyn IReadonlyRepository> {
    fn into_repos(
        self,
    ) -> (
        Arc<dyn IReadonlyRepository>,
        Option<Arc<dyn ICRUDRepository>>,
    ) {
        (self, None)
    }
}

impl EnrichmentVia for Arc<dyn ICRUDRepository> {
    fn into_repos(
        self,
    ) -> (
        Arc<dyn IReadonlyRepository>,
        Option<Arc<dyn ICRUDRepository>>,
    ) {
        let write = self.clone();
        (as_readonly(self), Some(write))
    }
}