use crate::cli::Cli;
use crate::config::{self, Config};
use std::path::Path;
pub(crate) fn setup_config(cli: &Cli) -> Result<Config, i32> {
let mut config = load_config(cli)?;
config.compile();
apply_cli_overrides(&mut config, cli);
validate_config_weights(&config)?;
Ok(config)
}
fn load_config(cli: &Cli) -> Result<Config, i32> {
cli.config
.as_ref()
.map(|p| load_explicit_config(p))
.unwrap_or_else(|| load_auto_config(&cli.path))
}
fn report_config_error<E: std::fmt::Display>(e: E) -> i32 {
eprintln!("Error: {e}");
2
}
fn load_explicit_config(config_path: &Path) -> Result<Config, i32> {
Config::load_from_file(config_path).map_err(report_config_error)
}
fn load_auto_config(path: &Path) -> Result<Config, i32> {
Config::load(path).map_err(report_config_error)
}
fn validate_config_weights(config: &Config) -> Result<(), i32> {
config::validate_weights(config).map_err(report_config_error)
}
pub(crate) fn apply_cli_overrides(config: &mut Config, cli: &Cli) {
if cli.strict_closures {
config.strict_closures = true;
}
if cli.strict_iterators {
config.strict_iterator_chains = true;
}
if cli.allow_recursion {
config.allow_recursion = true;
}
if cli.strict_error_propagation {
config.strict_error_propagation = true;
}
if cli.fail_on_warnings {
config.fail_on_warnings = true;
}
if let Some(ref coverage) = cli.coverage {
config.test_quality.coverage_file = Some(coverage.display().to_string());
}
}