modrun 1.0.2

Modular application composer for Tokio: domain modules, typed wiring, lifecycle
Documentation
use std::marker::PhantomData;

use crate::app::BuildState;
use crate::error::Result;
use crate::option::ModOption;
use crate::provide::take_once_value_provider;
use crate::trace::supplied_group;
use std::any::type_name;

pub(crate) fn supply_group<T: Clone + Send + Sync + 'static>(value: T) -> Box<dyn ModOption> {
    Box::new(SupplyGroupOption {
        value,
        _marker: PhantomData::<T>,
    })
}

struct SupplyGroupOption<T> {
    value: T,
    _marker: PhantomData<T>,
}

impl<T: Clone + Send + Sync + 'static> ModOption for SupplyGroupOption<T> {
    fn apply(self: Box<Self>, app: &mut BuildState) -> Result<()> {
        let scope = app.current_scope;
        let provider = take_once_value_provider(self.value, "<supply_group>");
        app.container
            .insert_group_member_typed::<T>(provider, scope)?;
        supplied_group(type_name::<T>(), app.container.scopes().name(scope), false);
        Ok(())
    }
}