use crate::compliance::ComplianceCheckResult;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComplianceReport {
pub generated_at: chrono::DateTime<chrono::Utc>,
pub results: Vec<ComplianceCheckResult>,
pub overall_compliant: bool,
}
impl ComplianceReport {
pub fn new(results: Vec<ComplianceCheckResult>) -> Self {
let overall_compliant = results.iter().all(|r| r.compliant);
Self {
generated_at: chrono::Utc::now(),
results,
overall_compliant,
}
}
pub fn to_text(&self) -> String {
let mut text = format!("Compliance Report\nGenerated: {}\n\n", self.generated_at);
for result in &self.results {
text.push_str(&format!(
"{:?}: {}\n",
result.standard,
if result.compliant {
"COMPLIANT"
} else {
"NON-COMPLIANT"
}
));
if !result.issues.is_empty() {
text.push_str("Issues:\n");
for issue in &result.issues {
text.push_str(&format!(" - {}\n", issue));
}
}
}
text
}
}