use serde::Deserialize;
use std::fmt::{Display, Formatter};
use strum::{Display, EnumDiscriminants, EnumString};
pub mod error;
pub(crate) mod utils;
pub mod v2_0;
pub mod v3;
pub mod v4_0;
pub mod version;
pub use error::ParseError;
#[derive(Debug, Deserialize, EnumDiscriminants)]
#[serde(tag = "version")]
#[strum_discriminants(name(Version))]
#[strum_discriminants(vis(pub))]
#[strum_discriminants(derive(Display, EnumString))]
pub enum Cvss {
#[serde(rename = "2.0")]
#[strum_discriminants(strum(serialize = "2.0"))]
V2(v2_0::CvssV2),
#[serde(rename = "3.0")]
#[strum_discriminants(strum(serialize = "3.0"))]
V3_0(v3::CvssV3),
#[serde(rename = "3.1")]
#[strum_discriminants(strum(serialize = "3.1"))]
V3_1(v3::CvssV3),
#[serde(rename = "4.0")]
#[strum_discriminants(strum(serialize = "4.0"))]
V4(v4_0::CvssV4),
}
impl Display for Cvss {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.vector_string())
}
}
impl Cvss {
pub fn version(&self) -> Version {
self.into()
}
pub fn vector_string(&self) -> &str {
match self {
Cvss::V2(c) => c.vector_string(),
Cvss::V3_0(c) => c.vector_string(),
Cvss::V3_1(c) => c.vector_string(),
Cvss::V4(c) => c.vector_string(),
}
}
pub fn base_score(&self) -> f64 {
match self {
Cvss::V2(c) => c.base_score(),
Cvss::V3_0(c) => c.base_score(),
Cvss::V3_1(c) => c.base_score(),
Cvss::V4(c) => c.base_score(),
}
}
pub fn base_severity(&self) -> Option<Severity> {
match self {
Cvss::V2(c) => c.base_severity(),
Cvss::V3_0(c) => c.base_severity(),
Cvss::V3_1(c) => c.base_severity(),
Cvss::V4(c) => c.base_severity(),
}
}
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
#[serde(rename_all = "UPPERCASE")]
pub enum Severity {
None,
Low,
Medium,
High,
Critical,
}