subcommands/
subcommands.rs1use 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}