lean_agent_core/
report.rs1use crate::{DiagnosticSeverity, FileStatus, ReportConfig, TraceRecord};
4use serde::{Deserialize, Serialize};
5use std::collections::BTreeMap;
6
7#[derive(Clone, Debug, Default, Serialize, Deserialize)]
9pub struct Report {
10 pub files_checked: usize,
12 pub passed: usize,
14 pub failed: usize,
16 pub timed_out: usize,
18 pub error_count: usize,
20 pub warning_count: usize,
22 pub top_messages: BTreeMap<String, usize>,
24}
25
26#[must_use]
28pub fn build_report(records: &[TraceRecord], _config: &ReportConfig) -> Report {
29 let mut report = Report::default();
30
31 for record in records {
32 let TraceRecord::FileTrace(file_trace) = record;
33 report.files_checked += 1;
34 match file_trace.status {
35 FileStatus::Passed => report.passed += 1,
36 FileStatus::Failed | FileStatus::RunnerError => report.failed += 1,
37 FileStatus::TimedOut => report.timed_out += 1,
38 }
39
40 for diagnostic in &file_trace.diagnostics {
41 match diagnostic.severity {
42 DiagnosticSeverity::Error => report.error_count += 1,
43 DiagnosticSeverity::Warning => report.warning_count += 1,
44 DiagnosticSeverity::Info | DiagnosticSeverity::Unknown => {}
45 }
46 let key = diagnostic
47 .message
48 .lines()
49 .next()
50 .unwrap_or("<empty diagnostic>")
51 .trim()
52 .to_owned();
53 *report.top_messages.entry(key).or_insert(0) += 1;
54 }
55 }
56
57 report
58}