WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 75eb4ee

Browse files
committed
feat: Derive clap::FromArgMatches for enums
1 parent 3249e4d commit 75eb4ee

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

clap_derive/src/derives/args.rs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)