pub mod table;
pub mod json;
use clap::ValueEnum;
use percli_core::EngineSnapshot;
use crate::scenario::runner::{RunResult, StepOutcome};
#[derive(Debug, Clone, Copy, ValueEnum)]
pub enum OutputFormat {
Table,
Json,
}
impl OutputFormat {
pub fn from_env() -> Self {
match std::env::var("PERC_FORMAT").ok().as_deref() {
Some("json") => OutputFormat::Json,
_ => OutputFormat::Table,
}
}
}
pub fn print_run_result(result: &RunResult, format: OutputFormat) {
match format {
OutputFormat::Table => {
for sr in &result.step_results {
let status = match &sr.outcome {
StepOutcome::Ok => "OK".to_string(),
StepOutcome::Warning(w) => format!("WARN: {w}"),
StepOutcome::QueryResult(_) => "QUERY".to_string(),
StepOutcome::AssertPassed => "PASS".to_string(),
StepOutcome::AssertFailed(msg) => format!("FAIL: {msg}"),
};
let prefix = format!("Step {:>2}", sr.step_num);
println!("{prefix}: {:<50} {status}", sr.description);
if let StepOutcome::QueryResult(snap) = &sr.outcome {
println!();
table::print_snapshot(snap);
println!();
}
}
println!();
println!("--- Final State ---");
println!();
table::print_snapshot(&result.final_snapshot);
}
OutputFormat::Json => {
json::print_run_result(result);
}
}
}
pub fn print_snapshot(snap: &EngineSnapshot, format: OutputFormat) {
match format {
OutputFormat::Table => table::print_snapshot(snap),
OutputFormat::Json => json::print_snapshot(snap),
}
}