use clap::Parser; use crate::utils::assert_output; #[test] fn test_safely_nest_parser() { #[derive(Parser, Debug, PartialEq)] struct Opt { #[command(flatten)] foo: Foo, } #[derive(Parser, Debug, PartialEq)] struct Foo { #[arg(long)] foo: bool, } assert_eq!( Opt { foo: Foo { foo: true } }, Opt::try_parse_from(&["test", "--foo"]).unwrap() ); } #[test] fn implicit_struct_group() { #[derive(Parser, Debug)] struct Opt { #[arg(short, long, requires = "Source")] add: bool, #[command(flatten)] source: Source, } #[derive(clap::Args, Debug)] struct Source { crates: Vec, #[arg(long)] path: Option, #[arg(long)] git: Option, } const OUTPUT: &str = "\ error: The following required arguments were not provided: |--git > Usage: prog --add |--git > For more information try '--help' "; assert_output::("prog --add", OUTPUT, true); use clap::Args; assert_eq!(Source::group_id(), Some(clap::Id::from("Source"))); assert_eq!(Opt::group_id(), Some(clap::Id::from("Opt"))); } #[test] fn skip_group_avoids_duplicate_ids() { #[derive(Parser, Debug)] struct Opt { #[command(flatten)] first: Compose, #[command(flatten)] second: Compose, } #[derive(clap::Args, Debug)] #[group(skip)] pub struct Compose { #[clap(flatten)] pub left: L, #[clap(flatten)] pub right: R, } #[derive(clap::Args, Clone, Copy, Debug)] #[group(skip)] pub struct Empty; use clap::CommandFactory; Opt::command().debug_assert(); use clap::Args; assert_eq!(Empty::group_id(), None); assert_eq!(Compose::::group_id(), None); assert_eq!(Opt::group_id(), Some(clap::Id::from("Opt"))); } #[test] #[should_panic = "\ Command clap: Argument group name must be unique \t'Compose' is already in use (note: `Args` implicitly creates `ArgGroup`s; disable with `#[group(skip)]`"] fn helpful_panic_on_duplicate_groups() { #[derive(Parser, Debug)] struct Opt { #[command(flatten)] first: Compose, #[command(flatten)] second: Compose, } #[derive(clap::Args, Debug)] pub struct Compose { #[clap(flatten)] pub left: L, #[clap(flatten)] pub right: R, } #[derive(clap::Args, Clone, Copy, Debug)] pub struct Empty; use clap::CommandFactory; Opt::command().debug_assert(); }