rite 0.2.2

Author, execute, and verify cryptographic key ceremonies (the `rite` CLI)
//! `rite verify`: check a ceremony transcript's integrity.

use std::path::PathBuf;

use clap::Args as ClapArgs;
use rite_runtime::{VerifyError, verify_step_fact_transcript};

#[derive(ClapArgs, Debug)]
pub struct Args {
    /// Path to the transcript JSONL file or output folder
    pub file: PathBuf,
}

pub fn run(args: Args) {
    let (transcript_path, source_dir) = if args.file.is_dir() {
        let candidate = args.file.join("transcript.jsonl");
        (candidate, Some(args.file))
    } else {
        (args.file, None)
    };

    match verify_step_fact_transcript(&transcript_path) {
        Ok(verified) => {
            println!("Transcript verified.");
            println!("  Facts:       {}", verified.fact_count);
            println!("  Fingerprint: {}", verified.fingerprint);
            if !verified.terminated {
                eprintln!(
                    "  Warning:     transcript is truncated, no CeremonyCompleted or \
                     CeremonyFailed fact at the end."
                );
            }
            std::process::exit(0);
        }
        Err(VerifyError::Io(e)) => {
            match (&source_dir, e.kind()) {
                (Some(dir), std::io::ErrorKind::NotFound) => {
                    eprintln!("No transcript found in folder: {}", dir.display());
                    eprintln!("Expected: {}", transcript_path.display());
                }
                _ => {
                    eprintln!("Failed to read transcript: {e}");
                }
            }
            std::process::exit(1);
        }
        Err(err) => {
            eprintln!("Verification failed: {err}");
            std::process::exit(1);
        }
    }
}