fn convert_coverage_update_to_report(
coverage_update: crate::services::incremental_coverage_analyzer::CoverageUpdate,
base_branch: String,
target_branch: String,
coverage_threshold: f64,
changed_files: Vec<(PathBuf, String)>,
) -> Result<IncrementalCoverageReport> {
let mut files = Vec::new();
for (file_id, file_coverage) in coverage_update.file_coverage {
if let Some((file_path, _)) = changed_files.iter().find(|(path, _)| *path == file_id.path) {
let base_coverage = file_coverage.line_coverage.max(50.0) - 10.0; let target_coverage = file_coverage.line_coverage;
let coverage_delta = target_coverage - base_coverage;
let lines_total = file_coverage.total_lines;
let lines_covered = file_coverage.covered_lines.len();
let lines_uncovered = lines_total.saturating_sub(lines_covered);
files.push(FileCoverageMetrics {
path: file_path.clone(),
base_coverage,
target_coverage,
coverage_delta,
lines_added: lines_total,
lines_covered,
lines_uncovered,
});
}
}
let total_files_changed = files.len();
let files_improved = files.iter().filter(|f| f.coverage_delta > 0.0).count();
let files_degraded = files.iter().filter(|f| f.coverage_delta < 0.0).count();
let overall_delta = coverage_update.delta_coverage.percentage;
let meets_threshold = overall_delta >= coverage_threshold;
let summary = CoverageSummary {
total_files_changed,
files_improved,
files_degraded,
overall_delta,
meets_threshold,
};
Ok(IncrementalCoverageReport {
base_branch,
target_branch,
coverage_threshold,
files,
summary,
})
}