chio-conformance 0.1.2

Scenario loading and report generation for Chio cross-language conformance
Documentation
use std::fs;
use std::path::PathBuf;

use chio_conformance::{
    generate_markdown_report, load_results_from_dir, load_scenarios_from_dir, CompatibilityReport,
};

fn main() {
    if let Err(error) = run() {
        eprintln!("error: {error}");
        std::process::exit(1);
    }
}

fn run() -> Result<(), Box<dyn std::error::Error>> {
    let mut args = std::env::args().skip(1);
    let scenarios_dir = next_path(&mut args, "--scenarios-dir")?;
    let results_dir = next_path(&mut args, "--results-dir")?;
    let output_path = next_path(&mut args, "--output")?;

    if args.next().is_some() {
        return Err("unexpected trailing arguments".into());
    }

    let report = CompatibilityReport {
        scenarios: load_scenarios_from_dir(&scenarios_dir)?,
        results: load_results_from_dir(&results_dir)?,
    };
    let markdown = generate_markdown_report(&report);
    if let Some(parent) = output_path.parent() {
        fs::create_dir_all(parent)?;
    }
    fs::write(output_path, markdown)?;
    Ok(())
}

fn next_path(
    args: &mut impl Iterator<Item = String>,
    expected_flag: &str,
) -> Result<PathBuf, Box<dyn std::error::Error>> {
    match args.next() {
        Some(flag) if flag == expected_flag => match args.next() {
            Some(value) => Ok(PathBuf::from(value)),
            None => Err(format!("missing value for {expected_flag}").into()),
        },
        Some(flag) => Err(format!("expected {expected_flag}, got {flag}").into()),
        None => Err(format!("expected {expected_flag}").into()),
    }
}