#[derive(Debug, Clone, Default)]
pub struct VulnerabilityReportView {
pub actionable: Vec<VulnerabilityView>,
pub informational: Vec<VulnerabilityView>,
#[allow(dead_code)]
pub threshold_exceeded: bool,
pub summary: VulnerabilitySummary,
}
#[derive(Debug, Clone)]
pub struct VulnerabilityView {
pub bom_ref: String,
pub id: String,
pub affected_component: String,
pub affected_component_name: String,
pub affected_version: String,
pub cvss_score: Option<f32>,
pub cvss_vector: Option<String>,
pub severity: SeverityView,
pub fixed_version: Option<String>,
pub description: Option<String>,
pub source_url: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum SeverityView {
Critical,
High,
Medium,
Low,
#[default]
None,
}
impl SeverityView {
pub fn as_str(&self) -> &'static str {
match self {
SeverityView::Critical => "CRITICAL",
SeverityView::High => "HIGH",
SeverityView::Medium => "MEDIUM",
SeverityView::Low => "LOW",
SeverityView::None => "NONE",
}
}
#[allow(dead_code)]
pub fn is_actionable(&self) -> bool {
matches!(
self,
SeverityView::Critical | SeverityView::High | SeverityView::Medium
)
}
}
#[derive(Debug, Clone, Default)]
pub struct VulnerabilitySummary {
pub total_count: usize,
#[allow(dead_code)]
pub actionable_count: usize,
#[allow(dead_code)]
pub informational_count: usize,
pub affected_package_count: usize,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_severity_view_as_str() {
assert_eq!(SeverityView::Critical.as_str(), "CRITICAL");
assert_eq!(SeverityView::High.as_str(), "HIGH");
assert_eq!(SeverityView::Medium.as_str(), "MEDIUM");
assert_eq!(SeverityView::Low.as_str(), "LOW");
assert_eq!(SeverityView::None.as_str(), "NONE");
}
#[test]
fn test_severity_view_is_actionable() {
assert!(SeverityView::Critical.is_actionable());
assert!(SeverityView::High.is_actionable());
assert!(SeverityView::Medium.is_actionable());
assert!(!SeverityView::Low.is_actionable());
assert!(!SeverityView::None.is_actionable());
}
#[test]
fn test_severity_view_ordering() {
assert!(SeverityView::Critical < SeverityView::High);
assert!(SeverityView::High < SeverityView::Medium);
assert!(SeverityView::Medium < SeverityView::Low);
assert!(SeverityView::Low < SeverityView::None);
}
#[test]
fn test_severity_view_default() {
assert_eq!(SeverityView::default(), SeverityView::None);
}
}