use crate::config::EnvSource;
use serde_json::Value;
pub struct EnvironmentHandler {
prefix: Option<String>,
source: std::sync::Arc<dyn EnvSource>,
}
impl EnvironmentHandler {
pub fn new(prefix: Option<String>, source: std::sync::Arc<dyn EnvSource>) -> Self {
Self { prefix, source }
}
pub fn get_env_var_name(&self, key: &str) -> Option<String> {
self.prefix.as_ref().map(|prefix| {
let env_key = key.replace('.', "_").to_uppercase();
format!("{}_{}", prefix.to_uppercase(), env_key)
})
}
pub fn get_env_override(&self, key: &str) -> Option<Value> {
let env_var_name = self.get_env_var_name(key)?;
self.source.var(&env_var_name).ok().map(|env_value| {
serde_json::from_str(&env_value).unwrap_or_else(|_| {
if env_value.eq_ignore_ascii_case("true") {
Value::Bool(true)
} else if env_value.eq_ignore_ascii_case("false") {
Value::Bool(false)
} else if let Ok(n) = env_value.parse::<i64>() {
Value::Number(n.into())
} else if let Ok(n) = env_value.parse::<f64>() {
serde_json::Number::from_f64(n)
.map_or_else(|| Value::String(env_value.clone()), Value::Number)
} else {
Value::String(env_value)
}
})
})
}
}