Skip to main content

swarm_engine_eval/reporter/
mod.rs

1//! Report generation
2
3pub mod json;
4
5pub use json::JsonReporter;
6
7use std::path::Path;
8
9use serde::{Deserialize, Serialize};
10
11use crate::aggregator::AggregatedResults;
12use crate::error::Result;
13use crate::run::EvalRun;
14
15/// Reporter trait
16pub trait Reporter {
17    /// Generate report
18    fn generate(&self, report: &EvalReport) -> Result<String>;
19
20    /// Write report to file
21    fn write_to_file(&self, report: &EvalReport, path: impl AsRef<Path>) -> Result<()> {
22        let content = self.generate(report)?;
23        std::fs::write(path, content)?;
24        Ok(())
25    }
26}
27
28/// Configuration summary for reports
29#[derive(Debug, Clone, Default, Serialize, Deserialize)]
30pub struct ConfigSummary {
31    /// Scenario name
32    pub scenario_name: String,
33    /// Scenario ID
34    pub scenario_id: String,
35    /// Number of workers
36    pub worker_count: usize,
37    /// Max ticks
38    pub max_ticks: u64,
39    /// Number of runs
40    pub run_count: usize,
41}
42
43/// Seed information
44#[derive(Debug, Clone, Default)]
45pub struct SeedInfo {
46    /// Base seed
47    pub base_seed: u64,
48    /// Seeds used for each run
49    pub run_seeds: Vec<u64>,
50}
51
52/// Assertion result
53#[derive(Debug, Clone, Serialize, Deserialize)]
54pub struct AssertionResult {
55    /// Assertion name
56    pub name: String,
57    /// Whether it passed
58    pub passed: bool,
59    /// Expected value
60    pub expected: String,
61    /// Actual value
62    pub actual: String,
63    /// Message
64    pub message: Option<String>,
65}
66
67/// Evaluation report
68#[derive(Debug, Clone, Serialize, Deserialize)]
69pub struct EvalReport {
70    /// Configuration summary
71    pub config_summary: ConfigSummary,
72
73    /// Seed information
74    #[serde(skip)]
75    pub seed_info: SeedInfo,
76
77    /// Individual run results
78    pub runs: Vec<EvalRun>,
79
80    /// Aggregated results
81    pub aggregated: AggregatedResults,
82
83    /// Assertion results
84    pub assertion_results: Vec<AssertionResult>,
85}
86
87impl EvalReport {
88    /// Check if all assertions passed
89    pub fn all_assertions_passed(&self) -> bool {
90        self.assertion_results.iter().all(|r| r.passed)
91    }
92
93    /// Write to JSON file
94    pub fn to_json_file(&self, path: impl AsRef<Path>) -> Result<()> {
95        JsonReporter::new().write_to_file(self, path)
96    }
97}