use bpaf::{Parser, construct, positional};
use crate::cli::TaskRef;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct WhyArgs {
pub target: TaskRef,
}
pub(super) fn why_command() -> impl Parser<WhyArgs> {
let target = positional::<String>("TASK")
.help("Task reference (REF-001..REF-008)")
.parse(|s| TaskRef::parse(&s).map_err(|e| e.to_string()));
construct!(WhyArgs { target })
}
#[cfg(test)]
mod tests {
use super::WhyArgs;
use crate::cli::{Cmd, TaskRef, parse};
fn task_ref(s: &str) -> TaskRef {
TaskRef::parse(s).unwrap()
}
#[test]
fn aux_013_why_parses_a_single_positional_target() {
assert_eq!(
parse(&["why", "lib:build"]).unwrap(),
Cmd::Why(WhyArgs {
target: task_ref("lib:build"),
}),
);
}
#[test]
fn aux_013_why_accepts_fan_out_reference_form_at_parse_time() {
assert_eq!(
parse(&["why", "^:test"]).unwrap(),
Cmd::Why(WhyArgs {
target: task_ref("^:test"),
}),
);
}
#[test]
fn aux_013_why_rejects_malformed_reference_at_parse_time() {
let err = parse(&["why", "no-colon"]).unwrap_err();
assert!(
!err.is_empty(),
"malformed reference must produce a parse diagnostic: {err}",
);
}
#[test]
fn aux_013_why_rejects_missing_positional() {
let err = parse(&["why"]).unwrap_err();
assert!(
!err.is_empty(),
"missing positional must produce a diagnostic: {err}",
);
}
#[test]
fn aux_013_why_rejects_extra_positional() {
let err = parse(&["why", "lib:build", "other:task"]).unwrap_err();
assert!(
!err.is_empty(),
"extra positional must produce a diagnostic: {err}",
);
}
#[test]
fn aux_013_why_rejects_unknown_flag() {
let err = parse(&["why", "--all", "lib:build"]).unwrap_err();
assert!(
!err.is_empty(),
"unknown flag must produce a diagnostic: {err}",
);
}
}