1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
use std::str::FromStr; use clap::ArgMatches; pub fn extract_str_arg(matches: &ArgMatches, arg_name: &str) -> String { match matches.value_of(arg_name) { Some(filename) => filename.to_string(), None => { eprintln!("the argument {} is required", arg_name); std::process::exit(1); } } } pub fn extract_optional_numeric_arg<T: FromStr>( matches: &ArgMatches, arg_name: &str, ) -> Result<Option<T>, String> where <T as std::str::FromStr>::Err: std::fmt::Display, { match matches.value_of(arg_name) { None => Ok(None), Some(s) => match s.parse::<T>() { Ok(val) => Ok(Some(val)), Err(why) => Err(format!("failed to parse {}: {}", arg_name, why)), }, } } pub fn extract_numeric_arg<T: FromStr>(matches: &ArgMatches, arg_name: &str) -> Result<T, String> where <T as std::str::FromStr>::Err: std::fmt::Display, { match extract_optional_numeric_arg(matches, arg_name)? { None => Err(format!("{} is not provided", arg_name)), Some(val) => Ok(val), } } pub fn extract_optional_str_arg(matches: &ArgMatches, arg_name: &str) -> Option<String> { match matches.value_of(arg_name) { None => None, Some(v) => Some(v.to_string()), } } pub fn extract_optional_str_vec_arg(matches: &ArgMatches, arg_name: &str) -> Option<Vec<String>> { match matches.values_of(arg_name) { None => None, Some(v) => Some(v.map(|s| s.to_string()).collect()), } } pub fn extract_str_vec_arg(matches: &ArgMatches, arg_name: &str) -> Result<Vec<String>, String> { match extract_optional_str_vec_arg(matches, arg_name) { None => Err(format!("{} is not provided", arg_name)), Some(v) => Ok(v), } } pub fn extract_boolean_flag(matches: &ArgMatches, arg_name: &str) -> bool { matches.is_present(arg_name) }