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}