use crate::forensics::evidence_collector::Evidence;
use crate::forensics::{CookieTimeline, ForensicConfig};
use chrono::Utc;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ForensicReport {
pub id: String,
pub generated_at: chrono::DateTime<Utc>,
pub executive_summary: String,
pub timeline: Option<CookieTimeline>,
pub evidence: Option<Evidence>,
pub findings: Vec<String>,
pub conclusions: Vec<String>,
}
pub struct ForensicReportBuilder {
timeline: Option<CookieTimeline>,
evidence: Option<Evidence>,
config: Option<ForensicConfig>,
}
impl ForensicReportBuilder {
#[must_use]
pub fn new() -> Self {
Self {
timeline: None,
evidence: None,
config: None,
}
}
#[must_use]
pub fn with_timeline(mut self, timeline: CookieTimeline) -> Self {
self.timeline = Some(timeline);
self
}
#[must_use]
pub fn with_evidence(mut self, evidence: Evidence) -> Self {
self.evidence = Some(evidence);
self
}
#[must_use]
pub fn with_config(mut self, config: &ForensicConfig) -> Self {
self.config = Some(config.clone());
self
}
pub fn build(self) -> crate::types::Result<ForensicReport> {
Ok(ForensicReport {
id: uuid::Uuid::new_v4().to_string(),
generated_at: Utc::now(),
executive_summary: "Forensic analysis completed".to_string(),
timeline: self.timeline,
evidence: self.evidence,
findings: Vec::new(),
conclusions: Vec::new(),
})
}
}
impl Default for ForensicReportBuilder {
fn default() -> Self {
Self::new()
}
}