diff --git a/clap_derive/src/attrs.rs b/clap_derive/src/attrs.rs index b51eeaad866..9a7bb7e7b29 100644 --- a/clap_derive/src/attrs.rs +++ b/clap_derive/src/attrs.rs @@ -127,15 +127,9 @@ impl Attrs { "parse attribute is not allowed for subcommand" ); } - if res.has_explicit_methods() { - abort!( - res.kind.span(), - "methods in attributes are not allowed for subcommand" - ); - } + use syn::Fields::*; use syn::FieldsUnnamed; - let field_ty = match variant.fields { Named(_) => { abort!(variant.span(), "structs are not allowed for subcommand"); diff --git a/tests/derive/subcommands.rs b/tests/derive/subcommands.rs index 3d122c85056..0986df574cf 100644 --- a/tests/derive/subcommands.rs +++ b/tests/derive/subcommands.rs @@ -296,7 +296,9 @@ fn external_subcommand_optional() { fn enum_in_enum_subsubcommand() { #[derive(Parser, Debug, PartialEq)] pub enum Opt { - #[clap(subcommand)] + #[clap(alias = "l")] + List, + #[clap(subcommand, alias = "d")] Daemon(DaemonCommand), } @@ -309,11 +311,20 @@ fn enum_in_enum_subsubcommand() { let result = Opt::try_parse_from(&["test"]); assert!(result.is_err()); + let result = Opt::try_parse_from(&["test", "list"]).unwrap(); + assert_eq!(Opt::List, result); + + let result = Opt::try_parse_from(&["test", "l"]).unwrap(); + assert_eq!(Opt::List, result); + let result = Opt::try_parse_from(&["test", "daemon"]); assert!(result.is_err()); let result = Opt::try_parse_from(&["test", "daemon", "start"]).unwrap(); assert_eq!(Opt::Daemon(DaemonCommand::Start), result); + + let result = Opt::try_parse_from(&["test", "d", "start"]).unwrap(); + assert_eq!(Opt::Daemon(DaemonCommand::Start), result); } #[test]