pub mod assessment;
pub mod contributor;
pub mod query;
pub mod topic;
use chrono::NaiveDateTime;
#[cfg(feature = "nvd-cves")]
use nvd_cves::impact::ImpactMetrics;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
#[serde(untagged)]
pub enum TagsOrReferences {
FoldedRecord(FoldedRecord),
References(References),
Tags(Tags),
}
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct References {
pub id: Uuid,
pub editor_id: Uuid,
pub created: NaiveDateTime,
pub name: String,
pub url: String,
pub ref_type: String,
pub ref_source: String,
}
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Tags {
pub id: Uuid,
pub name: String,
pub r#type: String,
pub code: String,
pub metadata: TagMetaData,
}
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct TagMetaData {
pub value: String,
pub source: String,
pub tactic_id: String,
pub tactic_name: String,
}
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Score {
pub attacker_value: f32,
pub exploitability: f32,
}
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone, Default)]
#[serde(rename_all = "camelCase")]
pub struct MetaData {
#[serde(default)]
pub configurations: Vec<String>,
#[serde(default)]
pub credits: Option<Credits>,
#[serde(default)]
pub cve_state: CveState,
#[cfg(feature = "nvd-cves")]
#[serde(flatten)]
pub cvss_metric_v31: ImpactMetrics,
#[serde(default)]
pub references: Vec<String>,
#[serde(default)]
pub vendor: Option<Vendor>,
#[serde(rename = "vulnerable-versions")]
pub vulnerable_versions: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Vendor {
#[serde(default)]
product_names: Vec<String>,
#[serde(default)]
vendor_names: Vec<String>,
}
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
pub enum CveState {
PUBLIC,
RESERVED,
}
impl Default for CveState {
fn default() -> Self {
Self::PUBLIC
}
}
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone, Default)]
#[serde(rename_all = "kebab-case")]
pub struct Credits {
#[serde(default)]
pub discovered_by: Vec<String>,
#[serde(default)]
pub module: Vec<String>,
#[serde(default)]
pub reporter: Vec<String>,
}
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct FoldedRecord {
pub id: Uuid,
}