use crate::{AppConfig, DotEnv};
use config::ConfigBuilder;
use strut_config::{Assembler, AssemblerChoices};
#[cfg(feature = "config-async")]
use config::builder::AsyncState;
#[cfg(not(feature = "config-async"))]
use config::builder::DefaultState;
pub trait ConfigurationWiring {
fn run(&self, choices: &AssemblerChoices) -> &'static AppConfig {
self.prepare_environment();
let builder = self.make_config_builder(choices);
#[cfg(feature = "config-live")]
self.seed_live_config(builder.clone());
self.seed_initial_config(builder);
let config = self.get_config();
config
}
fn prepare_environment(&self) {
DotEnv::tap();
}
#[cfg(not(feature = "config-async"))]
fn make_config_builder(&self, choices: &AssemblerChoices) -> ConfigBuilder<DefaultState> {
Assembler::make_sync_builder(choices)
}
#[cfg(feature = "config-async")]
fn make_config_builder(&self, choices: &AssemblerChoices) -> ConfigBuilder<AsyncState> {
Assembler::make_async_builder(choices)
}
#[cfg(not(feature = "config-async"))]
#[cfg(feature = "config-live")]
fn seed_live_config(&self, builder: ConfigBuilder<DefaultState>) {
crate::AppLiveConfig::set_builder(builder);
}
#[cfg(feature = "config-async")]
#[cfg(feature = "config-live")]
fn seed_live_config(&self, builder: ConfigBuilder<AsyncState>) {
crate::AppLiveConfig::set_builder(builder);
}
#[cfg(not(feature = "config-async"))]
fn seed_initial_config(&self, builder: ConfigBuilder<DefaultState>) {
AppConfig::seed(builder);
}
#[cfg(feature = "config-async")]
fn seed_initial_config(&self, builder: ConfigBuilder<AsyncState>) {
let tmp_runtime = tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
.expect("it should be possible to build a temporary tokio runtime");
tmp_runtime.block_on(AppConfig::seed(builder));
}
fn get_config(&self) -> &'static AppConfig {
AppConfig::get()
}
}
pub(crate) struct DefaultConfigurationWiring;
impl ConfigurationWiring for DefaultConfigurationWiring {}