subcommands/
subcommands.rs

1use std::str::FromStr;
2use std::io::{stdout, stderr};
3extern crate argparse;
4
5use argparse::{ArgumentParser, StoreTrue, Store, List};
6
7#[allow(non_camel_case_types)]
8#[derive(Debug)]
9enum Command {
10    play,
11    record,
12}
13
14impl FromStr for Command {
15    type Err = ();
16    fn from_str(src: &str) -> Result<Command, ()> {
17        return match src {
18            "play" => Ok(Command::play),
19            "record" => Ok(Command::record),
20            _ => Err(()),
21        };
22    }
23}
24
25
26
27fn play_command(verbose: bool, args: Vec<String>) {
28    let mut output = "".to_string();
29    {
30        let mut ap = ArgumentParser::new();
31        ap.set_description("Plays a sound");
32        ap.refer(&mut output)
33            .add_option(&["--output"], Store,
34                r#"Output sink to play to"#);
35        match ap.parse(args, &mut stdout(), &mut stderr()) {
36            Ok(()) =>  {}
37            Err(x) => {
38                std::process::exit(x);
39            }
40        }
41    }
42    println!("Verbosity: {}, Output: {}", verbose, output);
43}
44
45fn record_command(verbose: bool, args: Vec<String>) {
46    let mut input = "".to_string();
47    {
48        let mut ap = ArgumentParser::new();
49        ap.set_description("Records a sound");
50        ap.refer(&mut input)
51            .add_option(&["--input"], Store,
52                r#"Output source to record from"#);
53        match ap.parse(args, &mut stdout(), &mut stderr()) {
54            Ok(()) =>  {}
55            Err(x) => {
56                std::process::exit(x);
57            }
58        }
59    }
60    println!("Verbosity: {}, Input: {}", verbose, input);
61}
62
63fn main() {
64    let mut verbose = false;
65    let mut subcommand = Command::play;
66    let mut args = vec!();
67    {
68        let mut ap = ArgumentParser::new();
69        ap.set_description("Plays or records sound");
70        ap.refer(&mut verbose)
71            .add_option(&["-v", "--verbose"], StoreTrue,
72            "Be verbose");
73        ap.refer(&mut subcommand).required()
74            .add_argument("command", Store,
75                r#"Command to run (either "play" or "record")"#);
76        ap.refer(&mut args)
77            .add_argument("arguments", List,
78                r#"Arguments for command"#);
79        ap.stop_on_first_argument(true);
80        ap.parse_args_or_exit();
81    }
82
83    args.insert(0, format!("subcommand {:?}", subcommand));
84    match subcommand {
85        Command::play => play_command(verbose, args),
86        Command::record => record_command(verbose, args),
87    }
88}