modrun 1.0.1

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

use crate::app::BuildState;
use crate::error::Result;
use crate::option::ModOption;
use crate::trace::supplied;

pub(crate) fn supply<T: Send + Sync + 'static>(value: T) -> Box<dyn ModOption> {
    supply_vis(value, false)
}

pub(crate) fn supply_priv<T: Send + Sync + 'static>(value: T) -> Box<dyn ModOption> {
    supply_vis(value, true)
}

fn supply_vis<T: Send + Sync + 'static>(value: T, private: bool) -> Box<dyn ModOption> {
    Box::new(SupplyOption { value, private })
}

struct SupplyOption<T> {
    value: T,
    private: bool,
}

impl<T: Send + Sync + 'static> ModOption for SupplyOption<T> {
    fn apply(self: Box<Self>, app: &mut BuildState) -> Result<()> {
        let private = self.private;
        let scope = app.current_scope;
        app.container.insert_value(self.value, scope, private)?;
        supplied(
            type_name::<T>(),
            app.container.scopes().name(scope),
            private,
        );
        Ok(())
    }
}