use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use super::finding::ComplianceFinding;
use super::status::ComplianceStatus;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ComplianceResult {
pub co2e_score: Option<f64>,
pub repairability_index: Option<f64>,
pub recycled_content_pct: Option<f64>,
pub compliance_status: ComplianceStatus,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub violations: Vec<ComplianceFinding>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub warnings: Vec<ComplianceFinding>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ruleset_version: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub assessed_at: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub receipt: Option<serde_json::Value>,
}
impl Default for ComplianceResult {
fn default() -> Self {
Self {
co2e_score: None,
repairability_index: None,
recycled_content_pct: None,
compliance_status: ComplianceStatus::PassthroughNoValidation,
violations: Vec::new(),
warnings: Vec::new(),
ruleset_version: None,
assessed_at: None,
receipt: None,
}
}
}
impl ComplianceResult {
#[must_use]
pub fn passthrough() -> Self {
Self::default()
}
#[must_use]
pub fn with_status(status: ComplianceStatus) -> Self {
Self {
compliance_status: status,
..Self::default()
}
}
#[must_use]
pub fn has_violations(&self) -> bool {
!self.violations.is_empty()
}
}