From 1b18401ad9acc6f2fe6625b5cbb9b2b8f162536a Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 7 Nov 2018 20:34:42 -0500 Subject: factor out into subcommands --- src/cli.rs | 55 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 16 deletions(-) (limited to 'src/cli.rs') diff --git a/src/cli.rs b/src/cli.rs index 4e1d7cb..27b2742 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -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, + pub api_key: Option, } -pub fn get_options() -> Options { +pub fn get_options() -> failure::Fallible { 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()), + }) } -- cgit v1.2.3-54-g00ecf