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(())
}
}