config_items/
util.rs

1use serde::Deserialize;
2use std::path::Path;
3use yaml_merge_keys::*;
4use std::fs::{self};
5use log::*;
6
7use crate::{get_env_vars, get_yaml_filename, res::SRes};
8
9/// Deserialize YAML object from String
10pub fn read_yaml_from_string<T:for<'de> Deserialize<'de> >(str: &str) -> SRes<T> {
11    use yaml_merge_keys::serde_yaml::Value;
12    let sy:Value = serde_yaml::from_str(str)?;
13    let v: Result<Value, serde_yaml::Error> = serde_yaml::to_value(sy);
14    
15    let fix: Result<Value, MergeKeyError> = merge_keys_serde(v?);
16    Ok(serde_yaml::from_value(fix?)?)
17}
18
19/// Read file into String and deserialize YAML object
20pub fn read_yaml_from_file<T:for<'de> Deserialize<'de>, P: AsRef<Path>>(path: P) -> SRes<T> {
21    let sfile:String = fs::read_to_string(path)?.parse()?;
22    read_yaml_from_string(&sfile)
23}
24
25/// trait that asks for config filename (takes precedence over other guessings)
26pub trait CFGResolver {
27    fn get_from_argument(&self) -> Option<&str>;
28}
29
30/// Default resolver that does not resolves to any alterantive/custom configuration filename
31pub struct DefaultResolver {}
32impl CFGResolver for DefaultResolver {
33    fn get_from_argument(&self) -> Option<&str> { None }
34}
35
36/// Get name of config file resulting of various options
37pub fn get_config_file_name(resolver:&impl CFGResolver) -> String {
38    let config = match resolver.get_from_argument() {
39        Some(cfg)=>cfg.to_string(),
40        None=>{
41            let (_, conf_path, conf_dir, conf_file)=get_env_vars();
42            use std::env::*;
43            match var(&conf_path) {
44                Ok(cfg)=>cfg,
45                Err(_)=>{
46                    let dir = match var(&conf_dir) {
47                        Ok(d) => d,
48                        Err(_)=>".".to_string()
49                    };
50                    let file = match var(&conf_file) {
51                        Ok(f)=>f,
52                        Err(_)=>get_yaml_filename()
53                    };
54                    format!("{}/{}", dir, file)
55                }
56            }
57        }
58    };
59    debug!("Using config file '{config}'");
60    config
61}