Skip to content

Commit

Permalink
Merge pull request #4068 from danielparks/issue-3785-derive-id-attr-v3
Browse files Browse the repository at this point in the history
v3 fix(derive): Add "id" attribute
  • Loading branch information
epage authored Aug 12, 2022
2 parents bc84fc0 + d8e2549 commit e29f014
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 2 deletions.
2 changes: 1 addition & 1 deletion clap_derive/src/attrs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -450,7 +450,7 @@ impl Attrs {
}

fn push_method(&mut self, name: Ident, arg: impl ToTokens) {
if name == "name" {
if name == "name" || name == "id" {
self.name = Name::Assigned(quote!(#arg));
} else if name == "value_parser" {
self.value_parser = Some(ValueParser::Explicit(Method::new(name, quote!(#arg))));
Expand Down
4 changes: 3 additions & 1 deletion src/_derive/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -181,8 +181,10 @@
//! - e.g. `#[clap(max_values(3))]` would translate to `arg.max_values(3)`
//!
//! **Magic attributes**:
//! - `name = <expr>`: [`Arg::id`][crate::Arg::id]
//! - `id = <expr>`: [`Arg::id`][crate::Arg::id]
//! - When not present: case-converted field name is used
//! - `name = <expr>`: [`Arg::id`][crate::Arg::id]
//! - **Deprecated:** use `id`
//! - `value_parser [= <expr>]`: [`Arg::value_parser`][crate::Arg::value_parser]
//! - When not present: will auto-select an implementation based on the field type using
//! [`value_parser!][crate::value_parser!]
Expand Down
56 changes: 56 additions & 0 deletions tests/derive/naming.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,34 @@ fn test_standalone_long_ignores_afterwards_defined_custom_name() {
);
}

#[test]
fn test_standalone_long_uses_previous_defined_custom_id() {
#[derive(Parser, Debug, PartialEq)]
struct Opt {
#[clap(id = "foo", long)]
foo_option: bool,
}

assert_eq!(
Opt { foo_option: true },
Opt::try_parse_from(&["test", "--foo"]).unwrap()
);
}

#[test]
fn test_standalone_long_ignores_afterwards_defined_custom_id() {
#[derive(Parser, Debug, PartialEq)]
struct Opt {
#[clap(long, id = "foo")]
foo_option: bool,
}

assert_eq!(
Opt { foo_option: true },
Opt::try_parse_from(&["test", "--foo-option"]).unwrap()
);
}

#[test]
fn test_standalone_short_generates_kebab_case() {
#[derive(Parser, Debug, PartialEq)]
Expand Down Expand Up @@ -114,6 +142,34 @@ fn test_standalone_short_ignores_afterwards_defined_custom_name() {
);
}

#[test]
fn test_standalone_short_uses_previous_defined_custom_id() {
#[derive(Parser, Debug, PartialEq)]
struct Opt {
#[clap(id = "option", short)]
foo_option: bool,
}

assert_eq!(
Opt { foo_option: true },
Opt::try_parse_from(&["test", "-o"]).unwrap()
);
}

#[test]
fn test_standalone_short_ignores_afterwards_defined_custom_id() {
#[derive(Parser, Debug, PartialEq)]
struct Opt {
#[clap(short, id = "option")]
foo_option: bool,
}

assert_eq!(
Opt { foo_option: true },
Opt::try_parse_from(&["test", "-f"]).unwrap()
);
}

#[test]
fn test_standalone_long_uses_previous_defined_casing() {
#[derive(Parser, Debug, PartialEq)]
Expand Down

0 comments on commit e29f014

Please sign in to comment.