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
9pub 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
19pub 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
25pub trait CFGResolver {
27 fn get_from_argument(&self) -> Option<&str>;
28}
29
30pub struct DefaultResolver {}
32impl CFGResolver for DefaultResolver {
33 fn get_from_argument(&self) -> Option<&str> { None }
34}
35
36pub 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}