use eyre::OptionExt;
use crate::contracts::{Application, Facade, Service};
use crate::error::Error;
use crate::facades::{Config, container, Container};
use crate::services::{service, ServiceProvider};
pub fn run<A: Application>() {
let mut container = Container::new();
A::with_facades(&mut container);
container.into_static();
let mut service_provider = ServiceProvider::new();
A::register(&mut service_provider);
service_provider.into_static();
if let Some(err) = A::boot(service()).err() {
tracing::error!("boot error: {err}");
}
}
pub fn app<T: Facade>() -> Option<T> {
container().get::<T>().cloned()
}
pub fn config() -> eyre::Result<Config> {
app::<Config>().ok_or_eyre(Error::Message("Config not registered".to_owned()))
}