datasources 0.1.12

Async datasource interfaces, middleware, registry, and test doubles
Documentation
use crate::crud_repository_options::CRUDRepositoryOptions;
use crate::datasource_error::DatasourceError;
use crate::result::Result;
use std::collections::HashMap;

#[derive(Default)]
pub struct RepositoryBuilderOptionsFactory {
    fallback: Option<CRUDRepositoryOptions>,
    items: HashMap<String, CRUDRepositoryOptions>,
}

impl RepositoryBuilderOptionsFactory {
    pub fn new() -> Self {
        Self::default()
    }

    pub fn add(&mut self, options: CRUDRepositoryOptions) -> &mut Self {
        self.fallback = Some(options);
        self
    }

    pub fn add_for(&mut self, dialect: impl Into<String>, options: CRUDRepositoryOptions) -> &mut Self {
        self.items.insert(dialect.into(), options);
        self
    }

    pub fn for_provider(&self, provider: &str) -> Result<CRUDRepositoryOptions> {
        self.items
            .get(provider)
            .cloned()
            .or_else(|| self.fallback.clone())
            .ok_or_else(|| DatasourceError::message("repository options required"))
    }
}