Skip to content

Commit 6671d93

Browse files
authored
Merge pull request #5613 from epage/flatten
fix(derive): Improve flattening-skipped-group assert
2 parents e1bdfcc + 13dfdb3 commit 6671d93

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

clap_derive/src/derives/args.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -228,15 +228,24 @@ pub(crate) fn gen_augment(
228228

229229
let next_help_heading = item.next_help_heading();
230230
let next_display_order = item.next_display_order();
231+
let flatten_group_assert = if matches!(**ty, Ty::Option) {
232+
quote_spanned! { kind.span()=>
233+
<#inner_type as clap::Args>::group_id().expect("cannot `#[flatten]` an `Option<Args>` with `#[group(skip)]");
234+
}
235+
} else {
236+
quote! {}
237+
};
231238
if override_required {
232239
Some(quote_spanned! { kind.span()=>
240+
#flatten_group_assert
233241
let #app_var = #app_var
234242
#next_help_heading
235243
#next_display_order;
236244
let #app_var = <#inner_type as clap::Args>::augment_args_for_update(#app_var);
237245
})
238246
} else {
239247
Some(quote_spanned! { kind.span()=>
248+
#flatten_group_assert
240249
let #app_var = #app_var
241250
#next_help_heading
242251
#next_display_order;
@@ -499,7 +508,7 @@ pub(crate) fn gen_constructor(fields: &[(&Field, Item)]) -> Result<TokenStream,
499508
quote_spanned! { kind.span()=>
500509
#field_name: {
501510
let group_id = <#inner_type as clap::Args>::group_id()
502-
.expect("`#[arg(flatten)]`ed field type implements `Args::group_id`");
511+
.expect("asserted during `Arg` creation");
503512
if #arg_matches.contains_id(group_id.as_str()) {
504513
Some(
505514
<#inner_type as clap::FromArgMatches>::from_arg_matches_mut(#arg_matches)?

tests/derive/flatten.rs

+19
Original file line numberDiff line numberDiff line change
@@ -255,3 +255,22 @@ fn docstrings_ordering_with_multiple_clap_partial() {
255255

256256
assert!(short_help.contains("This is the docstring for Flattened"));
257257
}
258+
259+
#[test]
260+
#[should_panic = "cannot `#[flatten]` an `Option<Args>` with `#[group(skip)]"]
261+
fn flatten_skipped_group() {
262+
#[derive(clap::Parser, Debug)]
263+
struct Cli {
264+
#[clap(flatten)]
265+
args: Option<Args>,
266+
}
267+
268+
#[derive(clap::Args, Debug)]
269+
#[group(skip)]
270+
struct Args {
271+
#[clap(short)]
272+
param: bool,
273+
}
274+
275+
Cli::try_parse_from(["test"]).unwrap();
276+
}

0 commit comments

Comments
 (0)