program_flow/
argparse.rs

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