use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use thiserror::Error;
use crate::analyzer::dependency_parser::Language;
#[derive(Debug, Error)]
pub enum VulnerabilityError {
#[error("Failed to check vulnerabilities: {0}")]
CheckFailed(String),
#[error("API error: {0}")]
ApiError(String),
#[error("Command execution failed: {0}")]
CommandError(String),
#[error("Parse error: {0}")]
ParseError(String),
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("JSON error: {0}")]
Json(#[from] serde_json::Error),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VulnerabilityInfo {
pub id: String,
pub vuln_type: String, pub severity: VulnerabilitySeverity,
pub title: String,
pub description: String,
pub cve: Option<String>,
pub ghsa: Option<String>,
pub affected_versions: String,
pub patched_versions: Option<String>,
pub published_date: Option<DateTime<Utc>>,
pub references: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
pub enum VulnerabilitySeverity {
Critical,
High,
Medium,
Low,
Info,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct VulnerabilityReport {
pub checked_at: DateTime<Utc>,
pub total_vulnerabilities: usize,
pub critical_count: usize,
pub high_count: usize,
pub medium_count: usize,
pub low_count: usize,
pub vulnerable_dependencies: Vec<VulnerableDependency>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct VulnerableDependency {
pub name: String,
pub version: String,
pub language: Language,
pub vulnerabilities: Vec<VulnerabilityInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source_dir: Option<String>,
}