entrenar/quality/supply_chain/
audit_summary.rs1use serde::{Deserialize, Serialize};
4
5use super::{AuditStatus, DependencyAudit};
6
7#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
9pub struct AuditSummary {
10 pub total_dependencies: u32,
12
13 pub clean_count: u32,
15
16 pub warning_count: u32,
18
19 pub vulnerable_count: u32,
21
22 pub audits: Vec<DependencyAudit>,
24}
25
26impl AuditSummary {
27 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 pub fn has_vulnerabilities(&self) -> bool {
42 self.vulnerable_count > 0
43 }
44
45 pub fn has_issues(&self) -> bool {
47 self.warning_count > 0 || self.vulnerable_count > 0
48 }
49
50 pub fn vulnerable_deps(&self) -> Vec<&DependencyAudit> {
52 self.audits.iter().filter(|a| a.is_vulnerable()).collect()
53 }
54}