use clap::{Parser, ValueEnum};
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(name = "wickra-verify", version, about)]
pub struct Cli {
#[arg(long)]
pub claim: PathBuf,
#[arg(long)]
pub data: Option<PathBuf>,
#[arg(long, value_enum, default_value_t = Format::Text)]
pub format: Format,
#[arg(long)]
pub atol: Option<f64>,
#[arg(long)]
pub rtol: Option<f64>,
#[arg(long)]
pub explain: bool,
}
#[derive(Clone, Copy, Debug, ValueEnum, PartialEq, Eq)]
pub enum Format {
Text,
Json,
}
#[cfg(test)]
mod tests {
use super::*;
use clap::CommandFactory;
#[test]
fn arg_config_is_valid() {
Cli::command().debug_assert();
}
#[test]
fn claim_is_required() {
assert!(Cli::try_parse_from(["wickra-verify"]).is_err());
}
#[test]
fn defaults_are_text_and_no_data() {
let cli = Cli::try_parse_from(["wickra-verify", "--claim", "c.json"]).unwrap();
assert_eq!(cli.format, Format::Text);
assert!(cli.data.is_none());
assert!(!cli.explain);
}
#[test]
fn tolerances_and_format_parse() {
let cli = Cli::try_parse_from([
"wickra-verify",
"--claim",
"c.json",
"--format",
"json",
"--atol",
"1e-6",
"--rtol",
"1e-3",
"--explain",
])
.unwrap();
assert_eq!(cli.format, Format::Json);
assert!(cli.explain);
assert!((cli.atol.unwrap() - 1e-6).abs() < f64::EPSILON);
assert!((cli.rtol.unwrap() - 1e-3).abs() < f64::EPSILON);
}
}