use super::super::record::OracleTraceRecord;
use anyhow::Result;
use std::path::Path;
pub fn spool_filename(record: &OracleTraceRecord, ts_ms: i64) -> String {
let trace_id = if record.trace.trace_id.is_empty() {
uuid::Uuid::new_v4().to_string()
} else {
record.trace.trace_id.clone()
};
format!("{ts_ms}_{trace_id}_{}.jsonl", record.verdict)
}
pub async fn write_json_atomic(path: &Path, value: &OracleTraceRecord) -> Result<()> {
let parent = path
.parent()
.ok_or_else(|| anyhow::anyhow!("Invalid spool path {}", path.display()))?;
tokio::fs::create_dir_all(parent).await?;
let tmp_path = parent.join(format!(
".{}.tmp",
path.file_name()
.and_then(|n| n.to_str())
.unwrap_or("oracle_record")
));
let json = serde_json::to_string(value)
.map_err(|e| anyhow::anyhow!("Failed to serialize oracle record: {e}"))?;
tokio::fs::write(&tmp_path, json).await?;
tokio::fs::rename(&tmp_path, path).await?;
Ok(())
}