src/cli/getopts.rs: factor out reusable code

This commit is contained in:
Dietmar Maurer 2019-03-12 14:38:47 +01:00
parent e39efdbd33
commit b5fa28251c

View File

@ -52,47 +52,22 @@ fn parse_argument(arg: &str) -> RawArgument {
}; };
} }
/// Parses command line arguments using a `Schema` /// parse as many arguments as possible into a Vec<String, String>. This does not
/// /// verify the schema.
/// Returns parsed options as json object, together with the /// Returns parsed data and the rest as separate array
/// list of additional command line arguments. pub (crate) fn parse_argument_list<T: AsRef<str>>(
pub fn parse_arguments<T: AsRef<str>>(
args: &[T], args: &[T],
arg_param: &Vec<&'static str>,
schema: &ObjectSchema, schema: &ObjectSchema,
) -> Result<(Value, Vec<String>), ParameterError> { errors: &mut ParameterError,
let mut errors = ParameterError::new(); ) -> (Vec<(String, String)>, Vec<String>) {
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![];
let mut pos = 0; let mut pos = 0;
let properties = &schema.properties;
while pos < args.len() { while pos < args.len() {
match parse_argument(args[pos].as_ref()) { match parse_argument(args[pos].as_ref()) {
RawArgument::Separator => { RawArgument::Separator => {
@ -167,6 +142,47 @@ pub fn parse_arguments<T: AsRef<str>>(
rest.push(i.as_ref().to_string()); rest.push(i.as_ref().to_string());
} }
(data, rest)
}
/// Parses command line arguments using a `Schema`
///
/// Returns parsed options as json object, together with the
/// list of additional command line arguments.
pub fn parse_arguments<T: AsRef<str>>(
args: &[T],
arg_param: &Vec<&'static str>,
schema: &ObjectSchema,
) -> Result<(Value, Vec<String>), ParameterError> {
let mut errors = ParameterError::new();
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, mut rest) = parse_argument_list(args, schema, &mut errors);
for i in 0..arg_param.len() { for i in 0..arg_param.len() {
let name = arg_param[i]; let name = arg_param[i];