use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
pub enum Severity {
Info,
Low,
Medium,
High,
Critical,
}
impl fmt::Display for Severity {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Severity::Info => write!(f, "INFO"),
Severity::Low => write!(f, "LOW"),
Severity::Medium => write!(f, "MEDIUM"),
Severity::High => write!(f, "HIGH"),
Severity::Critical => write!(f, "CRITICAL"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Finding {
pub severity: Severity,
pub category: FindingCategory,
pub title: String,
pub description: String,
pub file: Option<String>,
pub line: Option<usize>,
pub snippet: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum FindingCategory {
CodeExecution,
NetworkAccess,
ProcessSpawn,
FileSystemAccess,
Obfuscation,
InstallScript,
EnvAccess,
Suspicious,
MaintainerChange,
HallucinatedPackage,
KnownVulnerability,
DependencyRisk,
}
impl fmt::Display for FindingCategory {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
FindingCategory::CodeExecution => write!(f, "Code Execution"),
FindingCategory::NetworkAccess => write!(f, "Network Access"),
FindingCategory::ProcessSpawn => write!(f, "Process Spawn"),
FindingCategory::FileSystemAccess => write!(f, "File System Access"),
FindingCategory::Obfuscation => write!(f, "Obfuscation"),
FindingCategory::InstallScript => write!(f, "Install Script"),
FindingCategory::EnvAccess => write!(f, "Env Access"),
FindingCategory::Suspicious => write!(f, "Suspicious"),
FindingCategory::MaintainerChange => write!(f, "Maintainer Change"),
FindingCategory::HallucinatedPackage => write!(f, "Hallucinated Package"),
FindingCategory::KnownVulnerability => write!(f, "Known Vulnerability"),
FindingCategory::DependencyRisk => write!(f, "Dependency Risk"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AnalysisReport {
pub package_name: String,
pub version: String,
pub findings: Vec<Finding>,
pub risk_score: f64,
pub risk_label: RiskLabel,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum RiskLabel {
Clean,
Low,
Medium,
High,
Critical,
}
impl fmt::Display for RiskLabel {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
RiskLabel::Clean => write!(f, "CLEAN"),
RiskLabel::Low => write!(f, "LOW RISK"),
RiskLabel::Medium => write!(f, "MEDIUM RISK"),
RiskLabel::High => write!(f, "HIGH RISK"),
RiskLabel::Critical => write!(f, "DO NOT INSTALL"),
}
}
}