Skip to main content

aaai_core/audit/
result.rs

1//! Audit result types.
2
3use crate::diff::entry::DiffEntry;
4use crate::config::definition::AuditEntry;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum AuditStatus {
8    Ok,
9    Pending,
10    Failed,
11    Ignored,
12    Error,
13}
14
15impl std::fmt::Display for AuditStatus {
16    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17        let s = match self {
18            AuditStatus::Ok => "OK",
19            AuditStatus::Pending => "Pending",
20            AuditStatus::Failed => "Failed",
21            AuditStatus::Ignored => "Ignored",
22            AuditStatus::Error => "Error",
23        };
24        write!(f, "{s}")
25    }
26}
27
28#[derive(Debug, Clone)]
29pub struct FileAuditResult {
30    pub diff: DiffEntry,
31    pub entry: Option<AuditEntry>,
32    pub status: AuditStatus,
33    pub detail: Option<String>,
34    /// Advisory warnings for this entry (non-fatal).
35    pub warnings: Vec<crate::audit::warning::AuditWarning>,
36}
37
38#[derive(Debug, Clone, Default)]
39pub struct AuditSummary {
40    pub total: usize,
41    pub ok: usize,
42    pub pending: usize,
43    pub failed: usize,
44    pub ignored: usize,
45    pub error: usize,
46    /// Total number of advisory warnings across all entries.
47    pub warning_count: usize,
48}
49
50impl AuditSummary {
51    pub fn from_results(results: &[FileAuditResult]) -> Self {
52        let mut s = AuditSummary::default();
53        s.total = results.len();
54        for r in results {
55            match r.status {
56                AuditStatus::Ok => s.ok += 1,
57                AuditStatus::Pending => s.pending += 1,
58                AuditStatus::Failed => s.failed += 1,
59                AuditStatus::Ignored => s.ignored += 1,
60                AuditStatus::Error => s.error += 1,
61            }
62            s.warning_count += r.warnings.len();
63        }
64        s
65    }
66
67    pub fn is_passing(&self) -> bool {
68        self.failed == 0 && self.pending == 0 && self.error == 0
69    }
70}
71
72#[derive(Debug, Clone)]
73pub struct AuditResult {
74    pub results: Vec<FileAuditResult>,
75    pub summary: AuditSummary,
76}
77
78impl AuditResult {
79    pub fn new(results: Vec<FileAuditResult>) -> Self {
80        let summary = AuditSummary::from_results(&results);
81        AuditResult { results, summary }
82    }
83}