syncable-cli 0.37.1

A Rust-based CLI that analyzes code repositories and generates Infrastructure as Code configurations
Documentation
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, // New field: "security", "unmaintained", or "yanked"
    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>,
    /// Source project directory (relative to scan root), e.g. "services/api"
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub source_dir: Option<String>,
}