Skip to content

Commit

Permalink
refactor(derive): Further generalize kind errors
Browse files Browse the repository at this point in the history
  • Loading branch information
epage committed Sep 2, 2022
1 parent 97ce0c4 commit dbdd449
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 67 deletions.
40 changes: 20 additions & 20 deletions clap_derive/src/derives/args.rs
Expand Up @@ -72,6 +72,13 @@ pub fn gen_for_struct(
generics: &Generics,
fields: &[(&Field, Item)],
) -> TokenStream {
if !matches!(&*item.kind(), Kind::Command(_)) {
abort! { item.kind().span(),
"`{}` cannot be used with `command`",
item.kind().name(),
}
}

let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();

let constructor = gen_constructor(fields);
Expand Down Expand Up @@ -194,12 +201,9 @@ pub fn gen_augment(
let args = fields.iter().filter_map(|(field, item)| {
let kind = item.kind();
match &*kind {
Kind::Command(ty)
| Kind::Value(ty) => {
abort!(ty.span(), "Invalid attribute are for arguments")
}

Kind::Subcommand(_)
Kind::Command(_)
| Kind::Value(_)
| Kind::Subcommand(_)
| Kind::Skip(_)
| Kind::FromGlobal(_)
| Kind::ExternalSubcommand => None,
Expand Down Expand Up @@ -341,14 +345,12 @@ pub fn gen_constructor(fields: &[(&Field, Item)]) -> TokenStream {
let kind = item.kind();
let arg_matches = format_ident!("__clap_arg_matches");
match &*kind {
Kind::Command(ty)
| Kind::Value(ty) => {
abort!(ty.span(), "Invalid attribute are for arguments")
}

Kind::ExternalSubcommand => {
Kind::Command(_)
| Kind::Value(_)
| Kind::ExternalSubcommand => {
abort! { kind.span(),
"`external_subcommand` can be used only on enum variants"
"`{}` cannot be used with `arg`",
kind.name(),
}
}
Kind::Subcommand(ty) => {
Expand Down Expand Up @@ -414,14 +416,12 @@ pub fn gen_updater(fields: &[(&Field, Item)], use_self: bool) -> TokenStream {
let arg_matches = format_ident!("__clap_arg_matches");

match &*kind {
Kind::Command(ty)
| Kind::Value(ty) => {
abort!(ty.span(), "Invalid attribute are for arguments")
}

Kind::ExternalSubcommand => {
Kind::Command(_)
| Kind::Value(_)
| Kind::ExternalSubcommand => {
abort! { kind.span(),
"`external_subcommand` can be used only on enum variants"
"`{}` cannot be used with `arg`",
kind.name(),
}
}
Kind::Subcommand(ty) => {
Expand Down
7 changes: 7 additions & 0 deletions clap_derive/src/derives/subcommand.rs
Expand Up @@ -52,6 +52,13 @@ pub fn gen_for_enum(
generics: &Generics,
variants: &[(&Variant, Item)],
) -> TokenStream {
if !matches!(&*item.kind(), Kind::Command(_)) {
abort! { item.kind().span(),
"`{}` cannot be used with `command`",
item.kind().name(),
}
}

let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();

let from_arg_matches = gen_from_arg_matches(variants);
Expand Down
7 changes: 7 additions & 0 deletions clap_derive/src/derives/value_enum.rs
Expand Up @@ -42,6 +42,13 @@ pub fn derive_value_enum(input: &DeriveInput) -> TokenStream {
}

pub fn gen_for_enum(item: &Item, item_name: &Ident, variants: &[(&Variant, Item)]) -> TokenStream {
if !matches!(&*item.kind(), Kind::Value(_)) {
abort! { item.kind().span(),
"`{}` cannot be used with `value`",
item.kind().name(),
}
}

let lits = lits(variants);
let value_variants = gen_value_variants(&lits);
let to_possible_value = gen_to_possible_value(item, &lits);
Expand Down
61 changes: 15 additions & 46 deletions clap_derive/src/item.rs
Expand Up @@ -103,19 +103,8 @@ impl Item {
"`action` attribute is only allowed on fields"
);
}
match &*res.kind {
Kind::Command(_) | Kind::Value(_) | Kind::Arg(_) => res,
Kind::Subcommand(_) | Kind::Skip(_) | Kind::FromGlobal(_) | Kind::Flatten => abort!(
res.kind.span(),
"`{}` is only allowed on fields",
res.kind.name(),
),
Kind::ExternalSubcommand => abort!(
res.kind.span(),
"`{}` is only allowed on variants",
res.kind.name(),
),
}

res
}

pub fn from_subcommand_variant(
Expand Down Expand Up @@ -155,8 +144,6 @@ impl Item {
res.doc_comment = vec![];
}

Kind::ExternalSubcommand => (),

Kind::Subcommand(_) => {
if let Some(value_parser) = res.value_parser.as_ref() {
abort!(
Expand Down Expand Up @@ -207,15 +194,13 @@ impl Item {

res.kind = Sp::new(Kind::Subcommand(ty), res.kind.span());
}
Kind::Skip(_) => (),
Kind::FromGlobal(_) => {
abort!(
res.kind.span(),
"`{}` is only allowed on fields",
res.kind.name(),
)
}
Kind::Command(_) | Kind::Value(_) | Kind::Arg(_) => (),

Kind::ExternalSubcommand
| Kind::FromGlobal(_)
| Kind::Skip(_)
| Kind::Command(_)
| Kind::Value(_)
| Kind::Arg(_) => (),
}

res
Expand Down Expand Up @@ -250,20 +235,8 @@ impl Item {
"`action` attribute is only allowed on fields"
);
}
match &*res.kind {
Kind::Command(_) | Kind::Value(_) | Kind::Arg(_) => res,
Kind::Skip(_) => res,
Kind::Subcommand(_) | Kind::FromGlobal(_) | Kind::Flatten => abort!(
res.kind.span(),
"`{}` is only allowed on fields",
res.kind.name(),
),
Kind::ExternalSubcommand => abort!(
res.kind.span(),
"`{}` is only allowed on variants",
res.kind.name(),
),
}

res
}

pub fn from_args_field(
Expand Down Expand Up @@ -309,12 +282,6 @@ impl Item {
res.doc_comment = vec![];
}

Kind::ExternalSubcommand => abort!(
res.kind.span(),
"`{}` is only allowed on variants",
res.kind.name(),
),

Kind::Subcommand(_) => {
if let Some(value_parser) = res.value_parser.as_ref() {
abort!(
Expand Down Expand Up @@ -366,7 +333,7 @@ impl Item {
let ty = Ty::from_syn_ty(&field.ty);
res.kind = Sp::new(Kind::FromGlobal(ty), orig_ty.span());
}
Kind::Command(_) | Kind::Value(_) | Kind::Arg(_) => {
Kind::Arg(_) => {
let ty = Ty::from_syn_ty(&field.ty);

match *ty {
Expand Down Expand Up @@ -403,6 +370,8 @@ impl Item {
.unwrap_or_else(|| field.ty.span()),
);
}

Kind::Command(_) | Kind::Value(_) | Kind::ExternalSubcommand => {}
}

res
Expand Down Expand Up @@ -1153,7 +1122,7 @@ pub enum Kind {
}

impl Kind {
fn name(&self) -> &'static str {
pub fn name(&self) -> &'static str {
match self {
Self::Arg(_) => "arg",
Self::Command(_) => "command",
Expand Down
2 changes: 1 addition & 1 deletion tests/derive_ui/struct_subcommand.stderr
@@ -1,4 +1,4 @@
error: `subcommand` is only allowed on fields
error: `subcommand` cannot be used with `command`
--> tests/derive_ui/struct_subcommand.rs:12:24
|
12 | #[clap(name = "basic", subcommand)]
Expand Down

0 comments on commit dbdd449

Please sign in to comment.