dipper/dyn_mod/module/
module_builder.rsuse crate::dyn_mod::component::Interface;
use crate::dyn_mod::module::{ComponentMap, ParameterMap};
use crate::dyn_mod::parameters::ComponentParameters;
use crate::dyn_mod::provider::ProviderFn;
use crate::dyn_mod::{Component, ComponentFn, DmRouter, HasComponent, HasProvider, Module, ModuleBuildContext};
use std::marker::PhantomData;
use std::path::PathBuf;
use std::sync::Arc;
pub struct ModuleBuilder<M: Module> {
parameters: ParameterMap,
submodules: M::Submodules,
component_overrides: ComponentMap,
component_fn_overrides: ComponentMap,
provider_overrides: ComponentMap,
router: Option<DmRouter>,
manifest_dir: PathBuf,
_module: PhantomData<M>,
}
#[allow(dead_code)]
impl<M: Module> ModuleBuilder<M> {
pub fn with_submodules(submodules: M::Submodules) -> Self {
ModuleBuilder {
parameters: ParameterMap::new(),
submodules,
component_overrides: ComponentMap::new(),
component_fn_overrides: ComponentMap::new(),
provider_overrides: ComponentMap::new(),
router: None,
manifest_dir: PathBuf::new(),
_module: PhantomData,
}
}
pub(crate) fn with_router(mut self, router: DmRouter) -> Self {
self.router = Some(router);
self
}
pub(crate) fn with_manifest_dir(mut self, manifest_dir: PathBuf) -> Self {
self.manifest_dir = manifest_dir;
self
}
pub fn with_component_parameters<C: Component<M>>(mut self, params: C::Parameters) -> Self
where
M: HasComponent<C::Interface>,
{
self.parameters.insert(ComponentParameters::<C, C::Parameters>::new(params));
self
}
pub fn with_component_override<I: Interface + ?Sized>(mut self, component: Box<I>) -> Self
where
M: HasComponent<I>,
{
self.component_overrides.insert::<Arc<I>>(Arc::from(component));
self
}
pub fn with_component_override_fn<I: Interface + ?Sized>(mut self, component_fn: ComponentFn<M, I>) -> Self
where
M: HasComponent<I>,
{
self.component_fn_overrides.insert(component_fn);
self
}
pub(crate) fn with_provider_override<I: 'static + ?Sized>(mut self, provider_fn: ProviderFn<M, I>) -> Self
where
M: HasProvider<I>,
{
self.provider_overrides.insert(Arc::new(provider_fn));
self
}
pub(crate) fn build(self) -> M {
M::build(ModuleBuildContext::new(
self.parameters,
self.component_overrides,
self.component_fn_overrides,
self.provider_overrides,
self.submodules,
self.router,
self.manifest_dir,
))
}
}