use serde::{Deserialize, Serialize};
use crate::{RepoOutcome, Severity, VulnFinding, WarnFinding};
pub const SCHEMA_VERSION: u32 = 1;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FleetReport {
pub schema_version: u32,
pub provenance: Provenance,
pub summary: Summary,
pub vulnerabilities: Vec<VulnFinding>,
pub warnings: Vec<WarnFinding>,
pub outcomes: Vec<RepoOutcome>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Provenance {
pub tool_version: String,
pub rustsec_crate_version: String,
pub db_commit: Option<String>,
pub db_timestamp: Option<String>,
pub host_os: String,
pub host_arch: String,
pub generated_at: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Summary {
pub repos_scanned: usize,
pub repos_errored: usize,
pub vuln_count: usize,
pub warn_count: usize,
pub max_severity: Severity,
pub stale_ignores: Vec<String>,
}
pub fn max_severity_of(vulns: &[VulnFinding]) -> Severity {
vulns
.iter()
.map(|v| v.severity)
.max()
.unwrap_or(Severity::Unknown)
}
impl FleetReport {
pub fn refresh_summary(&mut self) {
self.summary.vuln_count = self.vulnerabilities.len();
self.summary.warn_count = self.warnings.len();
self.summary.max_severity = max_severity_of(&self.vulnerabilities);
}
}