use crate::{DiagnosticSeverity, FileStatus, ReportConfig, TraceRecord};
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct Report {
pub files_checked: usize,
pub passed: usize,
pub failed: usize,
pub timed_out: usize,
pub error_count: usize,
pub warning_count: usize,
pub top_messages: BTreeMap<String, usize>,
}
#[must_use]
pub fn build_report(records: &[TraceRecord], _config: &ReportConfig) -> Report {
let mut report = Report::default();
for record in records {
let TraceRecord::FileTrace(file_trace) = record;
report.files_checked += 1;
match file_trace.status {
FileStatus::Passed => report.passed += 1,
FileStatus::Failed | FileStatus::RunnerError => report.failed += 1,
FileStatus::TimedOut => report.timed_out += 1,
}
for diagnostic in &file_trace.diagnostics {
match diagnostic.severity {
DiagnosticSeverity::Error => report.error_count += 1,
DiagnosticSeverity::Warning => report.warning_count += 1,
DiagnosticSeverity::Info | DiagnosticSeverity::Unknown => {}
}
let key = diagnostic
.message
.lines()
.next()
.unwrap_or("<empty diagnostic>")
.trim()
.to_owned();
*report.top_messages.entry(key).or_insert(0) += 1;
}
}
report
}