use serde::Deserialize;
use serde_yaml;
use std::env;
use std::fs::File;
use std::io::Read;
pub fn load_config_from_file<T, P>(path: P) -> Option<T>
where
T: for<'de> Deserialize<'de>,
P: AsRef<std::path::Path>,
{
let mut file = File::open(path).ok()?;
let mut contents = String::new();
file.read_to_string(&mut contents).ok()?;
serde_yaml::from_str(&contents).ok()
}
pub fn load_config<T>() -> Option<T>
where
T: for<'de> Deserialize<'de>,
{
let env_var = env::var("ENV").ok();
let candidates = match env_var.as_deref() {
Some(env) if !env.is_empty() => {
vec![
format!("config.{}.yml", env),
format!("config.{}.yaml", env),
]
}
_ => vec!["config.yml".to_string(), "config.yaml".to_string()],
};
for file_name in candidates {
if let Some(config) = load_config_from_file::<T, _>(&file_name) {
return Some(config);
}
}
None
}