Skip to main content

entrenar/quality/supply_chain/
audit_summary.rs

1//! Audit summary for dependency scanning.
2
3use serde::{Deserialize, Serialize};
4
5use super::{AuditStatus, DependencyAudit};
6
7/// Summary of a full dependency audit
8#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
9pub struct AuditSummary {
10    /// Total dependencies scanned
11    pub total_dependencies: u32,
12
13    /// Clean dependencies
14    pub clean_count: u32,
15
16    /// Dependencies with warnings
17    pub warning_count: u32,
18
19    /// Vulnerable dependencies
20    pub vulnerable_count: u32,
21
22    /// Individual audit results
23    pub audits: Vec<DependencyAudit>,
24}
25
26impl AuditSummary {
27    /// Create a summary from a list of audits
28    pub fn from_audits(audits: Vec<DependencyAudit>) -> Self {
29        let total_dependencies = audits.len() as u32;
30        let clean_count =
31            audits.iter().filter(|a| a.audit_status == AuditStatus::Clean).count() as u32;
32        let warning_count =
33            audits.iter().filter(|a| a.audit_status == AuditStatus::Warning).count() as u32;
34        let vulnerable_count =
35            audits.iter().filter(|a| a.audit_status == AuditStatus::Vulnerable).count() as u32;
36
37        Self { total_dependencies, clean_count, warning_count, vulnerable_count, audits }
38    }
39
40    /// Returns true if any vulnerabilities were found
41    pub fn has_vulnerabilities(&self) -> bool {
42        self.vulnerable_count > 0
43    }
44
45    /// Returns true if any issues (warnings or vulnerabilities) were found
46    pub fn has_issues(&self) -> bool {
47        self.warning_count > 0 || self.vulnerable_count > 0
48    }
49
50    /// Get all vulnerable dependencies
51    pub fn vulnerable_deps(&self) -> Vec<&DependencyAudit> {
52        self.audits.iter().filter(|a| a.is_vulnerable()).collect()
53    }
54}