diff options
Diffstat (limited to 'src/cmd')
-rw-r--r-- | src/cmd/sql.rs | 35 | ||||
-rw-r--r-- | src/cmd/sync.rs | 26 |
2 files changed, 56 insertions, 5 deletions
diff --git a/src/cmd/sql.rs b/src/cmd/sql.rs index ae398b5..b6a77cf 100644 --- a/src/cmd/sql.rs +++ b/src/cmd/sql.rs @@ -1,11 +1,40 @@ use db; use paths; -pub fn run(query: &str, tsv: bool) -> failure::Fallible<()> { +use clap; + +pub struct Options { + query: String, + tsv: bool, +} + +pub fn subcommand<'a, 'b>() -> clap::App<'a, 'b> { + clap::SubCommand::with_name("sql") + .about("Run a query against the local database") + .arg( + clap::Arg::with_name("query") + .required(true) + .help("query to run") + ) + .arg( + clap::Arg::with_name("tsv") + .long("tsv") + .help("format output as tsv") + ) +} + +pub fn options<'a>(matches: &clap::ArgMatches<'a>) -> Options { + Options { + query: matches.value_of("query").unwrap().to_string(), + tsv: matches.is_present("tsv"), + } +} + +pub fn run(options: &Options) -> failure::Fallible<()> { let db = db::DB::new(&paths::db_path()?)?; let rows_cell = std::cell::Cell::new(Some(vec![])); - let cols = db.query(query, |row| { + let cols = db.query(&options.query, |row| { let display_row: Vec<String> = (0..row.column_count()) .map(|i| row.get_raw(i)) .map(|v| format_value(&v)) @@ -17,7 +46,7 @@ pub fn run(query: &str, tsv: bool) -> failure::Fallible<()> { let rows = rows_cell.into_inner().unwrap(); - if tsv { + if options.tsv { print_tsv(&rows); } else { diff --git a/src/cmd/sync.rs b/src/cmd/sync.rs index 3f80202..9e09289 100644 --- a/src/cmd/sync.rs +++ b/src/cmd/sync.rs @@ -2,9 +2,31 @@ use db; use lastfm; use paths; -pub fn run(username: &str) -> failure::Fallible<()> { +use clap; + +pub struct Options { + username: String, +} + +pub fn subcommand<'a, 'b>() -> clap::App<'a, 'b> { + clap::SubCommand::with_name("sync") + .about("Updates the local copy of track data from last.fm") + .arg( + clap::Arg::with_name("username") + .required(true) + .help("last.fm username to fetch tracks for") + ) +} + +pub fn options<'a>(matches: &clap::ArgMatches<'a>) -> Options { + Options { + username: matches.value_of("username").unwrap().to_string(), + } +} + +pub fn run(options: &Options) -> failure::Fallible<()> { let db = db::DB::new(&paths::db_path()?)?; - let lastfm = lastfm::LastFMClient::new(username)?; + let lastfm = lastfm::LastFMClient::new(&options.username)?; let from = db.most_recent_timestamp()?.map(|x| x + 1); let to_fetch = lastfm.track_count(from)?; |