mirror of
https://github.com/clap-rs/clap
synced 2024-12-14 14:52:33 +00:00
Merge pull request #40 from epage/derive_vec
fix(derive): Define multiple policy for Special Types
This commit is contained in:
commit
c7aa471deb
3 changed files with 66 additions and 14 deletions
|
@ -302,8 +302,7 @@ pub fn gen_augment(
|
|||
Ty::OptionVec => quote_spanned! { ty.span()=>
|
||||
.takes_value(true)
|
||||
.value_name(#value_name)
|
||||
.multiple_values(true)
|
||||
.min_values(0)
|
||||
.multiple_occurrences(true)
|
||||
#possible_values
|
||||
#validator
|
||||
#allow_invalid_utf8
|
||||
|
@ -313,7 +312,7 @@ pub fn gen_augment(
|
|||
quote_spanned! { ty.span()=>
|
||||
.takes_value(true)
|
||||
.value_name(#value_name)
|
||||
.multiple_values(true)
|
||||
.multiple_occurrences(true)
|
||||
#possible_values
|
||||
#validator
|
||||
#allow_invalid_utf8
|
||||
|
@ -326,7 +325,6 @@ pub fn gen_augment(
|
|||
|
||||
Ty::Other if flag => quote_spanned! { ty.span()=>
|
||||
.takes_value(false)
|
||||
.multiple_values(false)
|
||||
},
|
||||
|
||||
Ty::Other => {
|
||||
|
|
|
@ -419,7 +419,7 @@ fn vec_type() {
|
|||
Opt {
|
||||
arg: vec![ArgChoice::Foo, ArgChoice::Bar]
|
||||
},
|
||||
Opt::try_parse_from(&["", "-a", "foo", "bar"]).unwrap()
|
||||
Opt::try_parse_from(&["", "-a", "foo", "-a", "bar"]).unwrap()
|
||||
);
|
||||
assert!(Opt::try_parse_from(&["", "-a", "fOo"]).is_err());
|
||||
}
|
||||
|
@ -439,10 +439,6 @@ fn option_vec_type() {
|
|||
}
|
||||
|
||||
assert_eq!(Opt { arg: None }, Opt::try_parse_from(&[""]).unwrap());
|
||||
assert_eq!(
|
||||
Opt { arg: Some(vec![]) },
|
||||
Opt::try_parse_from(&["", "-a"]).unwrap()
|
||||
);
|
||||
assert_eq!(
|
||||
Opt {
|
||||
arg: Some(vec![ArgChoice::Foo])
|
||||
|
@ -453,7 +449,7 @@ fn option_vec_type() {
|
|||
Opt {
|
||||
arg: Some(vec![ArgChoice::Foo, ArgChoice::Bar])
|
||||
},
|
||||
Opt::try_parse_from(&["", "-a", "foo", "bar"]).unwrap()
|
||||
Opt::try_parse_from(&["", "-a", "foo", "-a", "bar"]).unwrap()
|
||||
);
|
||||
assert!(Opt::try_parse_from(&["", "-a", "fOo"]).is_err());
|
||||
}
|
||||
|
|
|
@ -259,7 +259,7 @@ fn two_option_option_types() {
|
|||
}
|
||||
|
||||
#[test]
|
||||
fn vec_type_is_multiple_values() {
|
||||
fn vec_type_is_multiple_occurrences() {
|
||||
#[derive(Parser, PartialEq, Debug)]
|
||||
struct Opt {
|
||||
#[clap(short, long)]
|
||||
|
@ -270,6 +270,42 @@ fn vec_type_is_multiple_values() {
|
|||
Opt::try_parse_from(&["test", "-a24"]).unwrap()
|
||||
);
|
||||
assert_eq!(Opt { arg: vec![] }, Opt::try_parse_from(&["test"]).unwrap());
|
||||
assert_eq!(
|
||||
Opt { arg: vec![24, 42] },
|
||||
Opt::try_parse_from(&["test", "-a", "24", "-a", "42"]).unwrap()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn vec_type_with_required() {
|
||||
#[derive(Parser, PartialEq, Debug)]
|
||||
struct Opt {
|
||||
#[clap(short, long, required = true)]
|
||||
arg: Vec<i32>,
|
||||
}
|
||||
assert_eq!(
|
||||
Opt { arg: vec![24] },
|
||||
Opt::try_parse_from(&["test", "-a24"]).unwrap()
|
||||
);
|
||||
assert!(Opt::try_parse_from(&["test"]).is_err());
|
||||
assert_eq!(
|
||||
Opt { arg: vec![24, 42] },
|
||||
Opt::try_parse_from(&["test", "-a", "24", "-a", "42"]).unwrap()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn vec_type_with_multiple_values_only() {
|
||||
#[derive(Parser, PartialEq, Debug)]
|
||||
struct Opt {
|
||||
#[clap(short, long, multiple_values(true), multiple_occurrences(false))]
|
||||
arg: Vec<i32>,
|
||||
}
|
||||
assert_eq!(
|
||||
Opt { arg: vec![24] },
|
||||
Opt::try_parse_from(&["test", "-a24"]).unwrap()
|
||||
);
|
||||
assert_eq!(Opt { arg: vec![] }, Opt::try_parse_from(&["test"]).unwrap());
|
||||
assert_eq!(
|
||||
Opt { arg: vec![24, 42] },
|
||||
Opt::try_parse_from(&["test", "-a", "24", "42"]).unwrap()
|
||||
|
@ -308,6 +344,28 @@ fn option_vec_type() {
|
|||
Opt::try_parse_from(&["test", "-a", "1"]).unwrap()
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Opt {
|
||||
arg: Some(vec![1, 2])
|
||||
},
|
||||
Opt::try_parse_from(&["test", "-a", "1", "-a", "2"]).unwrap()
|
||||
);
|
||||
|
||||
assert_eq!(Opt { arg: None }, Opt::try_parse_from(&["test"]).unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn option_vec_type_structopt_behavior() {
|
||||
#[derive(Parser, PartialEq, Debug)]
|
||||
struct Opt {
|
||||
#[clap(short, long, multiple_values(true), min_values(0))]
|
||||
arg: Option<Vec<i32>>,
|
||||
}
|
||||
assert_eq!(
|
||||
Opt { arg: Some(vec![1]) },
|
||||
Opt::try_parse_from(&["test", "-a", "1"]).unwrap()
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Opt {
|
||||
arg: Some(vec![1, 2])
|
||||
|
@ -337,9 +395,9 @@ fn two_option_vec_types() {
|
|||
assert_eq!(
|
||||
Opt {
|
||||
arg: Some(vec![1]),
|
||||
b: Some(vec![])
|
||||
b: None,
|
||||
},
|
||||
Opt::try_parse_from(&["test", "-a", "1", "-b"]).unwrap()
|
||||
Opt::try_parse_from(&["test", "-a", "1"]).unwrap()
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
|
@ -355,7 +413,7 @@ fn two_option_vec_types() {
|
|||
arg: Some(vec![1, 2]),
|
||||
b: Some(vec![1, 2])
|
||||
},
|
||||
Opt::try_parse_from(&["test", "-a", "1", "2", "-b", "1", "2"]).unwrap()
|
||||
Opt::try_parse_from(&["test", "-a", "1", "-a", "2", "-b", "1", "-b", "2"]).unwrap()
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
|
|
Loading…
Reference in a new issue