summaryrefslogtreecommitdiffstats
path: root/src/cli.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/cli.rs')
-rw-r--r--src/cli.rs55
1 files changed, 39 insertions, 16 deletions
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<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()),
+ })
}