use serde::{Deserialize, Serialize};
use std::time::SystemTime;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum ReportError {
#[error("Report generation failed: {0}")]
ReportFailed(String),
}
pub type ReportResult<T> = Result<T, ReportError>;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ReportType {
AuditSummary,
ComplianceStatus,
SecurityIncidents,
DataAccess,
PolicyViolations,
}
#[derive(Debug, Clone)]
pub struct ReportConfig {
pub report_type: ReportType,
pub start_time: SystemTime,
pub end_time: SystemTime,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComplianceReport {
pub report_type: ReportType,
pub generated_at: SystemTime,
pub summary: String,
pub details: Vec<String>,
}
pub struct ReportGenerator {
config: ReportConfig,
}
impl ReportGenerator {
pub fn new(config: ReportConfig) -> Self {
Self { config }
}
pub fn generate(&self) -> ReportResult<ComplianceReport> {
Ok(ComplianceReport {
report_type: self.config.report_type.clone(),
generated_at: SystemTime::now(),
summary: format!("Report for {:?}", self.config.report_type),
details: Vec::new(),
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_report_generator() {
let config = ReportConfig {
report_type: ReportType::AuditSummary,
start_time: SystemTime::now(),
end_time: SystemTime::now(),
};
let generator = ReportGenerator::new(config);
let report = generator.generate().expect("generate report");
assert_eq!(report.report_type, ReportType::AuditSummary);
}
}