use std::{env, str::FromStr, sync::Arc};
use ::config::Config;
pub use error::{Error, Result};
use ultimate_common::string::b64u_decode;
pub use fusion_config::*;
pub use trace_config::{LogWriterType, TraceConfig};
pub(crate) use self::util::load_config;
mod error;
mod fusion_config;
mod trace_config;
mod util;
#[derive(Clone)]
pub struct ConfigState {
underling: Arc<Config>,
fusion_config: Arc<FusionConfig>,
}
impl ConfigState {
pub(crate) fn load() -> Result<Self> {
let c = load_config()?;
let fusion_config = FusionConfig::try_from(&c)?;
Ok(Self::new(Arc::new(c), Arc::new(fusion_config)))
}
pub(crate) fn new(underling: Arc<Config>, fusion_config: Arc<FusionConfig>) -> Self {
Self { underling, fusion_config }
}
pub fn fusion_config(&self) -> &FusionConfig {
self.fusion_config.as_ref()
}
pub fn fusion_config_clone(&self) -> Arc<FusionConfig> {
self.fusion_config.clone()
}
pub fn underling(&self) -> &Config {
self.underling.as_ref()
}
pub fn underling_clone(&self) -> Arc<Config> {
self.underling.clone()
}
}
pub fn get_env(name: &'static str) -> Result<String> {
env::var(name).map_err(|_| Error::ConfigMissingEnv(name))
}
pub fn get_env_parse<T: FromStr>(name: &'static str) -> Result<T> {
let val = get_env(name)?;
val.parse::<T>().map_err(|_| Error::ConfigWrongFormat(name))
}
pub fn get_env_b64u_as_u8s(name: &'static str) -> Result<Vec<u8>> {
b64u_decode(&get_env(name)?).map_err(|_| Error::ConfigWrongFormat(name))
}