use super::*;
use std::fmt;
#[derive(Clone, Debug, PartialEq)]
pub enum Nomenclature {
CvssB,
CvssBE,
CvssBT,
CvssBTE,
}
impl fmt::Display for Nomenclature {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Nomenclature::CvssB => write!(f, "CVSS-B"),
Nomenclature::CvssBE => write!(f, "CVSS-BE"),
Nomenclature::CvssBT => write!(f, "CVSS-BT"),
Nomenclature::CvssBTE => write!(f, "CVSS-BTE"),
}
}
}
impl From<&CvssV4> for Nomenclature {
fn from(cvss: &CvssV4) -> Self {
let has_threat = cvss.exploit_maturity.is_some();
let has_environmental = cvss.confidentiality_requirement.is_some()
|| cvss.integrity_requirement.is_some()
|| cvss.availability_requirement.is_some()
|| cvss.modified_attack_vector.is_some()
|| cvss.modified_attack_complexity.is_some()
|| cvss.modified_attack_requirements.is_some()
|| cvss.modified_privileges_required.is_some()
|| cvss.modified_user_interaction.is_some()
|| cvss.modified_vuln_confidentiality_impact.is_some()
|| cvss.modified_vuln_integrity_impact.is_some()
|| cvss.modified_vuln_availability_impact.is_some()
|| cvss.modified_sub_confidentiality_impact.is_some()
|| cvss.modified_sub_integrity_impact.is_some()
|| cvss.modified_sub_availability_impact.is_some();
match (has_threat, has_environmental) {
(true, true) => Nomenclature::CvssBTE,
(true, false) => Nomenclature::CvssBT,
(false, true) => Nomenclature::CvssBE,
(false, false) => Nomenclature::CvssB,
}
}
}
pub(crate) fn round_v4(value: f64) -> f64 {
let value = f64::clamp(value, 0.0, 10.0);
const EPSILON: f64 = 10e-6;
((value + EPSILON) * 10.0).round() / 10.0
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_round_v4() {
assert_eq!(round_v4(8.6 - 7.15), 1.5);
assert_eq!(round_v4(5.12345), 5.1);
assert_eq!(round_v4(5.15), 5.2);
assert_eq!(round_v4(5.14), 5.1);
assert_eq!(round_v4(-1.0), 0.0);
assert_eq!(round_v4(11.0), 10.0);
}
#[test]
fn test_nomenclature_display() {
assert_eq!(Nomenclature::CvssB.to_string(), "CVSS-B");
assert_eq!(Nomenclature::CvssBE.to_string(), "CVSS-BE");
assert_eq!(Nomenclature::CvssBT.to_string(), "CVSS-BT");
assert_eq!(Nomenclature::CvssBTE.to_string(), "CVSS-BTE");
}
}