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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
use std::str::FromStr;
use std::io::{stdout, stderr};
extern crate argparse;
use argparse::{ArgumentParser, StoreTrue, Store, List};
#[allow(non_camel_case_types)]
#[derive(Debug)]
enum Command {
play,
record,
}
impl FromStr for Command {
type Err = ();
fn from_str(src: &str) -> Result<Command, ()> {
return match src {
"play" => Ok(Command::play),
"record" => Ok(Command::record),
_ => Err(()),
};
}
}
fn play_command(verbose: bool, args: Vec<String>) {
let mut output = "".to_string();
{
let mut ap = ArgumentParser::new();
ap.set_description("Plays a sound");
ap.refer(&mut output)
.add_option(&["--output"], Store,
r#"Output sink to play to"#);
match ap.parse(args, &mut stdout(), &mut stderr()) {
Ok(()) => {}
Err(x) => {
std::process::exit(x);
}
}
}
println!("Verbosity: {}, Output: {}", verbose, output);
}
fn record_command(verbose: bool, args: Vec<String>) {
let mut input = "".to_string();
{
let mut ap = ArgumentParser::new();
ap.set_description("Records a sound");
ap.refer(&mut input)
.add_option(&["--input"], Store,
r#"Output source to record from"#);
match ap.parse(args, &mut stdout(), &mut stderr()) {
Ok(()) => {}
Err(x) => {
std::process::exit(x);
}
}
}
println!("Verbosity: {}, Input: {}", verbose, input);
}
fn main() {
let mut verbose = false;
let mut subcommand = Command::play;
let mut args = vec!();
{
let mut ap = ArgumentParser::new();
ap.set_description("Plays or records sound");
ap.refer(&mut verbose)
.add_option(&["-v", "--verbose"], StoreTrue,
"Be verbose");
ap.refer(&mut subcommand).required()
.add_argument("command", Store,
r#"Command to run (either "play" or "record")"#);
ap.refer(&mut args)
.add_argument("arguments", List,
r#"Arguments for command"#);
ap.stop_on_first_argument(true);
ap.parse_args_or_exit();
}
args.insert(0, format!("subcommand {:?}", subcommand));
match subcommand {
Command::play => play_command(verbose, args),
Command::record => record_command(verbose, args),
}
}
|