Skip to main content

lean_agent_core/
report.rs

1//! Building human-readable summaries from trace records.
2
3use crate::{DiagnosticSeverity, FileStatus, ReportConfig, TraceRecord};
4use serde::{Deserialize, Serialize};
5use std::collections::BTreeMap;
6
7/// Summary report over trace artifacts.
8#[derive(Clone, Debug, Default, Serialize, Deserialize)]
9pub struct Report {
10    /// Number of files checked.
11    pub files_checked: usize,
12    /// Files that passed.
13    pub passed: usize,
14    /// Files that failed.
15    pub failed: usize,
16    /// Files that timed out.
17    pub timed_out: usize,
18    /// Total parsed error diagnostics.
19    pub error_count: usize,
20    /// Total parsed warning diagnostics.
21    pub warning_count: usize,
22    /// Counts by normalized first-line diagnostic message.
23    pub top_messages: BTreeMap<String, usize>,
24}
25
26/// Build a report from trace records.
27#[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}