use super::options::Config;
use crate::APP_ARGS;
pub struct ConfigReader;
impl ConfigReader {
pub fn make() -> Config {
let config_path = &APP_ARGS.config;
if config_path != crate::DEFAULT_CONFIG_FILE_PATH
&& !std::path::Path::new(config_path).exists()
{
panic!("Cannot find config file at '{config_path}'");
}
debug!("reading config file: {config_path}");
let raw_config: config::Config = config::Config::builder()
.add_source(config::File::from_str(
super::defaults::defaults(),
config::FileFormat::Toml,
))
.add_source(config::File::new(config_path, config::FileFormat::Toml).required(false))
.add_source(
config::Environment::with_prefix("SONIC")
.separator("__")
.prefix_separator("_"),
)
.build()
.expect("error reading config");
let config = raw_config
.try_deserialize::<Config>()
.expect("syntax error in config");
Self::validate(&config);
config
}
fn validate(config: &Config) {
if config.store.kv.database.write_buffer == 0 {
panic!("write_buffer for kv must not be zero");
}
if config.store.kv.database.flush_after >= config.store.kv.pool.inactive_after {
panic!("flush_after for kv must be strictly lower than inactive_after");
}
if config.store.fst.graph.consolidate_after >= config.store.fst.pool.inactive_after {
panic!("consolidate_after for fst must be strictly lower than inactive_after");
}
}
}