use std::path::PathBuf;
use clap::Parser;
#[derive(Parser, Debug)]
#[command(name = "wickra-radar", version, about)]
pub struct Args {
#[arg(long)]
pub spec: PathBuf,
#[arg(long, conflicts_with = "stdin")]
pub events: Option<PathBuf>,
#[arg(long, conflicts_with = "events")]
pub stdin: bool,
#[arg(long)]
pub limit: Option<usize>,
#[arg(long)]
pub threshold: Option<f64>,
#[arg(long, value_enum, default_value_t = Format::Text)]
pub format: Format,
}
#[derive(clap::ValueEnum, Clone, Copy, Debug, PartialEq, Eq)]
pub enum Format {
Text,
Json,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parses_all_options() {
let args = Args::try_parse_from([
"wickra-radar",
"--spec",
"s.json",
"--events",
"evdir",
"--limit",
"10",
"--threshold",
"0.4",
"--format",
"json",
])
.unwrap();
assert_eq!(args.spec, PathBuf::from("s.json"));
assert_eq!(args.events, Some(PathBuf::from("evdir")));
assert!(!args.stdin);
assert_eq!(args.limit, Some(10));
assert_eq!(args.threshold, Some(0.4));
assert_eq!(args.format, Format::Json);
}
#[test]
fn format_defaults_to_text() {
let args = Args::try_parse_from(["wickra-radar", "--spec", "s.json", "--stdin"]).unwrap();
assert_eq!(args.format, Format::Text);
assert!(args.stdin);
assert!(args.limit.is_none());
}
#[test]
fn events_and_stdin_conflict() {
let err = Args::try_parse_from([
"wickra-radar",
"--spec",
"s.json",
"--events",
"evdir",
"--stdin",
]);
assert!(err.is_err());
}
}