use envsubst::substitute;
use std::{
collections::{hash_set::HashSet, HashMap},
env, fs,
};
use toml;
use super::config::*;
use crate::APP_ARGS;
pub struct ConfigReader;
impl ConfigReader {
pub fn make() -> Config {
debug!("reading config file: {}", &APP_ARGS.config);
let mut conf = fs::read_to_string(&APP_ARGS.config).expect("cannot find config file");
debug!("read config file: {}", &APP_ARGS.config);
let environment = env::vars().collect::<HashMap<String, String>>();
conf = substitute(&conf, &environment).expect("cannot substitute environment variables");
let config = toml::from_str(&conf).expect("syntax error in config file");
Self::validate(&config);
config
}
fn validate(config: &Config) {
Self::validate_identifiers(config)
}
fn validate_identifiers(config: &Config) {
let mut service_identifiers = HashSet::new();
for service in config.probe.service.iter() {
if service_identifiers.insert(&service.id) == false {
panic!(
"configuration has duplicate service identifier: {}",
service.id
)
}
let mut node_identifiers = HashSet::new();
for node in service.node.iter() {
if node_identifiers.insert(&node.id) == false {
panic!(
"configuration has duplicate node identifier: {} in service: {}",
node.id, service.id
)
}
}
}
}
}