use std::fs;
use std::path::Path;
use serde::{Deserialize, Serialize};
use super::config::SimulationConfig;
use super::stats::StatsSummary;
use super::user_profiles::UserDescriptor;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct ReplayLog {
pub version: u32,
pub global_seed: u64,
pub config: SimulationConfig,
pub user_seeds: Vec<UserDescriptor>,
pub schema_seeds: Vec<u64>,
pub stop_reason: StopReason,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) enum StopReason {
DurationElapsed,
CrashDetected,
ResourceLimit,
UserAbort,
}
impl ReplayLog {
pub(crate) fn write(&self, output_dir: &Path) -> std::io::Result<()> {
let path = output_dir.join("replay.json");
let json = serde_json::to_string_pretty(self).map_err(std::io::Error::other)?;
fs::write(&path, json)?;
eprintln!("[stress] Replay log written to {}", path.display());
Ok(())
}
pub(crate) fn load(path: &Path) -> std::io::Result<Self> {
let json = fs::read_to_string(path)?;
let log: ReplayLog = serde_json::from_str(&json)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?;
Ok(log)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct SummaryLog {
pub config: SimulationConfig,
pub results: StatsSummary,
}
impl SummaryLog {
pub(crate) fn write(&self, output_dir: &Path) -> std::io::Result<()> {
let path = output_dir.join("summary.json");
let json = serde_json::to_string_pretty(self).map_err(std::io::Error::other)?;
fs::write(&path, json)?;
eprintln!("[stress] Summary written to {}", path.display());
Ok(())
}
}