//! Conformance corpus for DRED decoded exactly (`live-conformance/dred/`, extensions/opus-dred.md §9).
//!
//!   wai_dred_vectors gen    <corpus-dir> <weights-file>   write vectors.json from fixed seeds
//!   wai_dred_vectors verify <corpus-dir> <weights-file>   it regenerates byte for byte, no other
//!                                                         file but README.md is there, and every
//!                                                         vector gets the outcome it states
//!
//! `<weights-file>` is the draft's weights file ([DRED-Weights], draft-ietf-mlcodec-opus-dred-07
//! §7.1), which the corpus names by digest and does not hold; `live-conformance/dred/fetch.sh`
//! fetches it and checks the digest. The generator and this verifier are one implementation. The
//! corpus's second implementation is `live-conformance/dred_verify.py`, written from the
//! extension's text and sharing no code with this binary.

use std::path::Path;
use wai::dred_exact::corpus;

fn main() {
    let a: Vec<String> = std::env::args().collect();
    let (Some(cmd), Some(dir), Some(w)) = (a.get(1), a.get(2), a.get(3)) else {
        eprintln!("usage: wai_dred_vectors gen|verify <corpus-dir> <weights-file>");
        std::process::exit(2);
    };
    let weights = match std::fs::read(w) {
        Ok(b) => b,
        Err(e) => {
            eprintln!("read {w}: {e}");
            std::process::exit(1);
        }
    };
    let r = match cmd.as_str() {
        "gen" => corpus::generate(&weights, Path::new(dir)).map(|_| format!("wrote {dir}")),
        "verify" => corpus::verify(&weights, Path::new(dir)).map(|_| format!("{dir}: every file regenerates and every vector reaches its outcome")),
        _ => {
            eprintln!("usage: wai_dred_vectors gen|verify <corpus-dir> <weights-file>");
            std::process::exit(2);
        }
    };
    match r {
        Ok(m) => println!("{m}"),
        Err(e) => {
            eprintln!("{e}");
            std::process::exit(1);
        }
    }
}
