@@ -83,12 +83,15 @@ pub(crate) fn gen_for_enum(
8383 let mut augmentations = TokenStream :: default ( ) ;
8484 let mut augmentations_update = TokenStream :: default ( ) ;
8585
86+ let mut constructors = TokenStream :: default ( ) ;
87+
8688 for ( item, variant) in variants. iter ( ) {
8789 let Fields :: Named ( ref fields) = variant. fields else {
8890 abort ! { variant. span( ) ,
8991 "`#[derive(Args)]` only supports named enum variants if used on an enum" ,
9092 }
9193 } ;
94+ let group_id = item. group_id ( ) ;
9295
9396 let conflicts = variants
9497 . iter ( )
@@ -114,9 +117,65 @@ pub(crate) fn gen_for_enum(
114117
115118 augmentations. extend ( augmentation) ;
116119 augmentations_update. extend ( augmentation_update) ;
120+
121+ let variant_name = & variant. ident ;
122+ let genned_constructor = gen_constructor ( & fields) ?;
123+ let constructor = quote ! {
124+ if __clap_arg_matches. contains_id( #group_id) {
125+ let v = #item_name:: #variant_name #genned_constructor;
126+ return :: std:: result:: Result :: Ok ( v)
127+ }
128+ } ;
129+
130+ constructors. extend ( constructor) ;
117131 }
118132
133+ let raw_deprecated = raw_deprecated ( ) ;
134+
119135 Ok ( quote ! {
136+ #[ allow(
137+ dead_code,
138+ unreachable_code,
139+ unused_variables,
140+ unused_braces,
141+ unused_qualifications,
142+ ) ]
143+ #[ allow(
144+ clippy:: style,
145+ clippy:: complexity,
146+ clippy:: pedantic,
147+ clippy:: restriction,
148+ clippy:: perf,
149+ clippy:: deprecated,
150+ clippy:: nursery,
151+ clippy:: cargo,
152+ clippy:: suspicious_else_formatting,
153+ clippy:: almost_swapped,
154+ clippy:: redundant_locals,
155+ ) ]
156+ #[ automatically_derived]
157+ impl #impl_generics clap:: FromArgMatches for #item_name #ty_generics #where_clause {
158+ fn from_arg_matches( __clap_arg_matches: & clap:: ArgMatches ) -> :: std:: result:: Result <Self , clap:: Error > {
159+ Self :: from_arg_matches_mut( & mut __clap_arg_matches. clone( ) )
160+ }
161+
162+ fn from_arg_matches_mut( __clap_arg_matches: & mut clap:: ArgMatches ) -> :: std:: result:: Result <Self , clap:: Error > {
163+ #raw_deprecated
164+ #constructors
165+ unreachable!( )
166+ }
167+
168+ fn update_from_arg_matches( & mut self , __clap_arg_matches: & clap:: ArgMatches ) -> :: std:: result:: Result <( ) , clap:: Error > {
169+ self . update_from_arg_matches_mut( & mut __clap_arg_matches. clone( ) )
170+ }
171+
172+ fn update_from_arg_matches_mut( & mut self , __clap_arg_matches: & mut clap:: ArgMatches ) -> :: std:: result:: Result <( ) , clap:: Error > {
173+ #raw_deprecated
174+ // #updater
175+ :: std:: result:: Result :: Ok ( ( ) )
176+ }
177+ }
178+
120179
121180 #[ allow(
122181 dead_code,
0 commit comments