From 42122787d75cff83a7ce97a7dd2129b9a4d8cd69 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Fri, 30 Sep 2022 12:24:18 -0500 Subject: [PATCH] feat(derive): Report the group id This will be needed when we support flattening for #3165 --- clap_derive/src/derives/args.rs | 12 +++++++++++- tests/derive/groups.rs | 9 +++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/clap_derive/src/derives/args.rs b/clap_derive/src/derives/args.rs index a92d02ee8dc..21786505a82 100644 --- a/clap_derive/src/derives/args.rs +++ b/clap_derive/src/derives/args.rs @@ -90,6 +90,13 @@ pub fn gen_for_struct( let augmentation = gen_augment(fields, &app_var, item, false); let augmentation_update = gen_augment(fields, &app_var, item, true); + let group_id = if item.skip_group() { + quote!(None) + } else { + let group_id = item.ident().unraw().to_string(); + quote!(Some(clap::Id::from(#group_id))) + }; + quote! { #[allow(dead_code, unreachable_code, unused_variables, unused_braces)] #[allow( @@ -140,6 +147,9 @@ pub fn gen_for_struct( )] #[deny(clippy::correctness)] impl #impl_generics clap::Args for #item_name #ty_generics #where_clause { + fn group_id() -> Option { + #group_id + } fn augment_args<'b>(#app_var: clap::Command) -> clap::Command { #augmentation } @@ -313,11 +323,11 @@ pub fn gen_augment( quote!() }; let initial_app_methods = parent_item.initial_top_level_methods(); - let group_id = parent_item.ident().unraw().to_string(); let final_app_methods = parent_item.final_top_level_methods(); let group_app_methods = if parent_item.skip_group() { quote!() } else { + let group_id = parent_item.ident().unraw().to_string(); let literal_group_members = fields .iter() .filter_map(|(_field, item)| { diff --git a/tests/derive/groups.rs b/tests/derive/groups.rs index 99cba73ef98..23a9fff3685 100644 --- a/tests/derive/groups.rs +++ b/tests/derive/groups.rs @@ -53,6 +53,10 @@ 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] @@ -80,4 +84,9 @@ fn skip_group_avoids_duplicate_ids() { 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"))); }