diff options
author | Jesse Luehrs <doy@tozt.net> | 2018-11-07 20:34:42 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2018-11-07 20:34:42 -0500 |
commit | 1b18401ad9acc6f2fe6625b5cbb9b2b8f162536a (patch) | |
tree | 264bd3d34dec937e0ddfc2c277bb854f1d878067 /src/cli.rs | |
parent | f2c66c8e47fddd468b0b6894e7c1902b0baecc16 (diff) | |
download | lastfm-query-1b18401ad9acc6f2fe6625b5cbb9b2b8f162536a.tar.gz lastfm-query-1b18401ad9acc6f2fe6625b5cbb9b2b8f162536a.zip |
factor out into subcommands
Diffstat (limited to 'src/cli.rs')
-rw-r--r-- | src/cli.rs | 55 |
1 files changed, 39 insertions, 16 deletions
@@ -1,28 +1,51 @@ use clap; +use failure; const _DUMMY_DEPENDENCY: &'static str = include_str!("../Cargo.toml"); +pub enum Command { + Sync, +} + pub struct Options { - pub username: String, - pub api_key: String, + pub command: Command, + pub username: Option<String>, + pub api_key: Option<String>, } -pub fn get_options() -> Options { +pub fn get_options() -> failure::Fallible<Options> { let matches = app_from_crate!() - .arg( - clap::Arg::with_name("username") - .required(true) - .help("last.fm username to fetch tracks for") - ) - .arg( - clap::Arg::with_name("api_key") - .required(true) - .help("last.fm api key") + .subcommand( + clap::SubCommand::with_name("sync") + .about("Updates the local copy of track data from last.fm") + .arg( + clap::Arg::with_name("username") + .short("u") + .long("username") + .value_name("USERNAME") + .required(true) + .help("last.fm username to fetch tracks for") + ) + .arg( + clap::Arg::with_name("api-key") + .short("k") + .long("api-key") + .value_name("API_KEY") + .required(true) + .help("last.fm api key") + ) ) .get_matches(); - Options { - username: matches.value_of("username").unwrap().to_string(), - api_key: matches.value_of("api_key").unwrap().to_string(), - } + let (command, sub_matches) = match matches.subcommand() { + ("sync", Some(matches)) => (Command::Sync, matches), + (name, Some(_)) => bail!("unknown subcommand: {}", name), + (_, None) => bail!("no subcommand given"), + }; + + Ok(Options { + command: command, + username: sub_matches.value_of("username").map(|s| s.to_string()), + api_key: sub_matches.value_of("api-key").map(|s| s.to_string()), + }) } |