Skip to main content

datasynth_eval/report/
json.rs

1//! JSON report generation.
2//!
3//! Generates machine-readable JSON reports for CI/CD integration.
4
5use super::{EvaluationReport, ReportGenerator};
6use crate::error::EvalResult;
7use serde_json;
8
9/// JSON report generator.
10pub struct JsonReportGenerator {
11    /// Whether to pretty-print the JSON.
12    pretty: bool,
13}
14
15impl JsonReportGenerator {
16    /// Create a new generator.
17    pub fn new(pretty: bool) -> Self {
18        Self { pretty }
19    }
20}
21
22impl Default for JsonReportGenerator {
23    fn default() -> Self {
24        Self::new(true)
25    }
26}
27
28impl ReportGenerator for JsonReportGenerator {
29    fn generate(&self, report: &EvaluationReport) -> EvalResult<String> {
30        let json = if self.pretty {
31            serde_json::to_string_pretty(report)?
32        } else {
33            serde_json::to_string(report)?
34        };
35        Ok(json)
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42    use crate::report::ReportMetadata;
43    use chrono::Utc;
44
45    #[test]
46    fn test_json_generation() {
47        let metadata = ReportMetadata {
48            generated_at: Utc::now(),
49            version: "1.0.0".to_string(),
50            data_source: "test".to_string(),
51            thresholds_name: "default".to_string(),
52            records_evaluated: 1000,
53            duration_ms: 500,
54        };
55
56        let report = EvaluationReport::new(metadata, None, None, None, None);
57        let generator = JsonReportGenerator::new(true);
58        let json = generator.generate(&report).unwrap();
59
60        assert!(json.contains("generated_at"));
61        assert!(json.contains("passes"));
62    }
63}