Skip to content

Commit

Permalink
Merge pull request #3541 from plaflamme/fix-argenum-defaults
Browse files Browse the repository at this point in the history
fix: multiple default values combined with `ArgEnum` / `PossibleValues`
  • Loading branch information
epage committed Mar 7, 2022
2 parents 2bd3dd7 + b6df23d commit 8170754
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 9 deletions.
32 changes: 23 additions & 9 deletions src/build/debug_asserts.rs
Expand Up @@ -675,15 +675,29 @@ fn assert_defaults<'d>(
for default_os in defaults {
if let Some(default_s) = default_os.to_str() {
if !arg.possible_vals.is_empty() {
assert!(
arg.possible_vals.iter().any(|possible_val| {
possible_val.matches(default_s, arg.is_ignore_case_set())
}),
"Argument `{}`'s {}={} doesn't match possible values",
arg.name,
field,
default_s
);
if let Some(delim) = arg.get_value_delimiter() {
for part in default_s.split(delim) {
assert!(
arg.possible_vals.iter().any(|possible_val| {
possible_val.matches(part, arg.is_ignore_case_set())
}),
"Argument `{}`'s {}={} doesn't match possible values",
arg.name,
field,
part
)
}
} else {
assert!(
arg.possible_vals.iter().any(|possible_val| {
possible_val.matches(default_s, arg.is_ignore_case_set())
}),
"Argument `{}`'s {}={} doesn't match possible values",
arg.name,
field,
default_s
);
}
}

if let Some(validator) = arg.validator.as_ref() {
Expand Down
36 changes: 36 additions & 0 deletions tests/derive/arg_enum.rs
Expand Up @@ -457,3 +457,39 @@ fn option_vec_type() {
);
assert!(Opt::try_parse_from(&["", "-a", "fOo"]).is_err());
}

#[test]
fn vec_type_default_value() {
#[derive(clap::ArgEnum, PartialEq, Debug, Clone)]
enum ArgChoice {
Foo,
Bar,
Baz,
}

#[derive(Parser, PartialEq, Debug)]
struct Opt {
#[clap(
arg_enum,
short,
long,
default_value = "foo,bar",
value_delimiter = ','
)]
arg: Vec<ArgChoice>,
}

assert_eq!(
Opt {
arg: vec![ArgChoice::Foo, ArgChoice::Bar]
},
Opt::try_parse_from(&[""]).unwrap()
);

assert_eq!(
Opt {
arg: vec![ArgChoice::Foo, ArgChoice::Baz]
},
Opt::try_parse_from(&["", "-a", "foo,baz"]).unwrap()
);
}

0 comments on commit 8170754

Please sign in to comment.