use crate::cli::Cli;
use crate::config::Config;
use crate::domain::PERCENTAGE_MULTIPLIER;
use crate::report::Summary;
pub(crate) fn apply_exit_gates(cli: &Cli, config: &Config, summary: &Summary) -> Result<(), i32> {
warn_suppression_ratio(summary, config.max_suppression_ratio);
check_fail_on_warnings(config, summary)?;
check_quality_gates(cli, summary)?;
check_default_fail(cli.no_fail, summary.total_findings())
}
fn warn_suppression_ratio(summary: &Summary, max_ratio: f64) {
if !summary.suppression_ratio_exceeded || summary.total == 0 {
return;
}
eprintln!(
"Warning: {} suppression(s) found ({:.1}% of functions, max: {:.1}%)",
summary.all_suppressions,
summary.all_suppressions as f64 / summary.total as f64 * PERCENTAGE_MULTIPLIER,
max_ratio * PERCENTAGE_MULTIPLIER,
);
}
pub(crate) fn check_fail_on_warnings(config: &Config, summary: &Summary) -> Result<(), i32> {
if config.fail_on_warnings && summary.suppression_ratio_exceeded {
eprintln!("Error: warnings present and --fail-on-warnings is set");
return Err(1);
}
Ok(())
}
pub(crate) fn check_quality_gates(cli: &Cli, summary: &Summary) -> Result<(), i32> {
cli.min_quality_score
.iter()
.try_for_each(|&s| check_min_quality_score(s, summary))
}
pub(crate) fn check_min_quality_score(min_score: f64, summary: &Summary) -> Result<(), i32> {
let actual = summary.quality_score * PERCENTAGE_MULTIPLIER;
if actual < min_score {
eprintln!("Quality score {actual:.1}% is below minimum {min_score:.1}%");
return Err(1);
}
Ok(())
}
pub(crate) fn check_default_fail(no_fail: bool, total_findings: usize) -> Result<(), i32> {
if !no_fail && total_findings > 0 {
return Err(1);
}
Ok(())
}