use std::collections::HashMap;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use url::Url;
use super::repos::sbom::SbomDependencyGraph;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ChangeType {
Added,
Removed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum DependencyScope {
Unknown,
Runtime,
Development,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum DependencyRelationship {
Direct,
Indirect,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct DependencyVulnerability {
pub severity: String,
pub advisory_ghsa_id: String,
pub advisory_summary: String,
pub advisory_url: Url,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct DependencyDiff {
pub change_type: ChangeType,
pub manifest: String,
pub ecosystem: String,
pub name: String,
pub version: String,
pub package_url: Option<String>,
pub license: Option<String>,
pub source_repository_url: Option<Url>,
pub vulnerabilities: Vec<DependencyVulnerability>,
pub scope: DependencyScope,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SnapshotJob {
pub id: String,
pub correlator: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub html_url: Option<Url>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SnapshotDetector {
pub name: String,
pub version: String,
pub url: Url,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SnapshotManifestFile {
#[serde(skip_serializing_if = "Option::is_none")]
pub source_location: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SnapshotResolvedPackage {
#[serde(skip_serializing_if = "Option::is_none")]
pub package_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, serde_json::Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub relationship: Option<DependencyRelationship>,
#[serde(skip_serializing_if = "Option::is_none")]
pub scope: Option<DependencyScope>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dependencies: Option<Vec<String>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SnapshotManifest {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub file: Option<SnapshotManifestFile>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, serde_json::Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resolved: Option<HashMap<String, SnapshotResolvedPackage>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Snapshot {
pub version: u64,
pub job: SnapshotJob,
pub sha: String,
#[serde(rename = "ref")]
pub ref_field: String,
pub detector: SnapshotDetector,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, serde_json::Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub manifests: Option<HashMap<String, SnapshotManifest>>,
pub scanned: DateTime<Utc>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct CreateSnapshotResponse {
pub id: u64,
pub created_at: String,
pub result: String,
pub message: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
#[deprecated(
note = "This operation is closing down and will not be accessible after November 13, 2026. Please migrate to the asynchronous flow using generate_report and fetch_report."
)]
pub struct Sbom {
pub sbom: SbomDependencyGraph,
}