use springtime::application;
use springtime::config::{ApplicationConfig, ApplicationConfigProvider};
use springtime::runner::ApplicationRunner;
use springtime_di::future::{BoxFuture, FutureExt};
use springtime_di::instance_provider::{ComponentInstancePtr, ErrorPtr};
use springtime_di::{component_alias, Component};
#[derive(Component)]
#[component(constructor = "MyApplicationConfigProvider::new")]
struct MyApplicationConfigProvider {
#[component(ignore)]
config: ApplicationConfig,
}
impl MyApplicationConfigProvider {
fn new() -> BoxFuture<'static, Result<Self, ErrorPtr>> {
async {
let mut config = ApplicationConfig::default();
config.install_tracing_logger = false;
Ok(Self { config })
}
.boxed()
}
}
#[component_alias]
impl ApplicationConfigProvider for MyApplicationConfigProvider {
fn config(&self) -> BoxFuture<'_, Result<&ApplicationConfig, ErrorPtr>> {
async { Ok(&self.config) }.boxed()
}
}
#[derive(Component)]
struct ConfigPrinterRunner {
application_config_provider: ComponentInstancePtr<dyn ApplicationConfigProvider + Send + Sync>,
}
#[component_alias]
impl ApplicationRunner for ConfigPrinterRunner {
fn run(&self) -> BoxFuture<'_, Result<(), ErrorPtr>> {
async {
let config = self.application_config_provider.config().await?;
println!("Using built-in logger: {}", config.install_tracing_logger);
Ok(())
}
.boxed()
}
}
#[tokio::main]
async fn main() {
let mut application =
application::create_default().expect("unable to create default application");
application.run().await.expect("error running application");
}