use percli_core::EngineSnapshot;
use crate::scenario::runner::{RunResult, StepOutcome};
use serde_json::{json, Value};
pub fn print_snapshot(snap: &EngineSnapshot) {
let j = serde_json::to_string_pretty(snap).expect("snapshot serialization");
println!("{j}");
}
pub fn print_run_result(result: &RunResult) {
let steps: Vec<Value> = result
.step_results
.iter()
.map(|sr| {
let status = match &sr.outcome {
StepOutcome::Ok => "ok",
StepOutcome::Warning(_) => "warning",
StepOutcome::QueryResult(_) => "query",
StepOutcome::AssertPassed => "pass",
StepOutcome::AssertFailed(_) => "fail",
};
let message = match &sr.outcome {
StepOutcome::Warning(w) => Some(w.clone()),
StepOutcome::AssertFailed(m) => Some(m.clone()),
_ => None,
};
let mut step_val = json!({
"step": sr.step_num,
"description": sr.description,
"status": status,
});
if let Some(msg) = message {
step_val["message"] = json!(msg);
}
if let StepOutcome::QueryResult(snap) = &sr.outcome {
step_val["snapshot"] = serde_json::to_value(snap).unwrap();
}
step_val
})
.collect();
let output = json!({
"steps": steps,
"final_state": result.final_snapshot,
});
println!("{}", serde_json::to_string_pretty(&output).unwrap());
}