src/cli/getopts.rs: support positional array arguments
This commit is contained in:
parent
f33fa27307
commit
aaba6faace
@ -65,6 +65,29 @@ pub fn parse_arguments<T: AsRef<str>>(
|
|||||||
|
|
||||||
let properties = &schema.properties;
|
let properties = &schema.properties;
|
||||||
|
|
||||||
|
// first check if all arg_param exists in schema
|
||||||
|
|
||||||
|
let mut last_arg_param_is_optional = false;
|
||||||
|
let mut last_arg_param_is_array = false;
|
||||||
|
|
||||||
|
for i in 0..arg_param.len() {
|
||||||
|
let name = arg_param[i];
|
||||||
|
if let Some((optional, param_schema)) = properties.get::<str>(&name) {
|
||||||
|
if i == arg_param.len() -1 {
|
||||||
|
last_arg_param_is_optional = *optional;
|
||||||
|
if let Schema::Array(_) = param_schema.as_ref() {
|
||||||
|
last_arg_param_is_array = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if *optional {
|
||||||
|
panic!("positional argument '{}' may not be optional", name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
panic!("no such property '{}' in schema", name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let mut data: Vec<(String, String)> = vec![];
|
let mut data: Vec<(String, String)> = vec![];
|
||||||
let mut rest: Vec<String> = vec![];
|
let mut rest: Vec<String> = vec![];
|
||||||
|
|
||||||
@ -145,10 +168,23 @@ pub fn parse_arguments<T: AsRef<str>>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
for i in 0..arg_param.len() {
|
for i in 0..arg_param.len() {
|
||||||
if rest.len() > i {
|
|
||||||
data.push((arg_param[i].to_string(), rest[i].clone()));
|
let name = arg_param[i];
|
||||||
|
let is_last_arg_param = (i == arg_param.len() - 1);
|
||||||
|
|
||||||
|
if rest.len() == 0 {
|
||||||
|
if !(is_last_arg_param && last_arg_param_is_optional) {
|
||||||
|
errors.push(format_err!("missing argument '{}'", name));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
errors.push(format_err!("missing argument '{}'", arg_param[i]));
|
if is_last_arg_param && last_arg_param_is_array {
|
||||||
|
for value in rest {
|
||||||
|
data.push((name.to_string(), value));
|
||||||
|
}
|
||||||
|
rest = vec![];
|
||||||
|
} else {
|
||||||
|
data.push((name.to_string(), rest.remove(0)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -156,10 +192,6 @@ pub fn parse_arguments<T: AsRef<str>>(
|
|||||||
return Err(errors);
|
return Err(errors);
|
||||||
}
|
}
|
||||||
|
|
||||||
if arg_param.len() > 0 {
|
|
||||||
rest = rest[arg_param.len()..].to_vec();
|
|
||||||
}
|
|
||||||
|
|
||||||
let options = parse_parameter_strings(&data, schema, true)?;
|
let options = parse_parameter_strings(&data, schema, true)?;
|
||||||
|
|
||||||
Ok((options, rest))
|
Ok((options, rest))
|
||||||
|
Loading…
Reference in New Issue
Block a user