percli 0.1.0

Offline CLI simulator for the Percolator risk engine
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),
    }
}