diff --git a/imag-bookmark/Cargo.toml b/imag-bookmark/Cargo.toml new file mode 100644 index 00000000..c0b0e01d --- /dev/null +++ b/imag-bookmark/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "imag-bookmark" +version = "0.1.0" +authors = ["Matthias Beyer "] + +[dependencies] +clap = "2.1.1" +log = "0.3" +version = "2.0.1" + +[dependencies.libimagrt] +path = "../libimagrt" + +[dependencies.libimagutil] +path = "../libimagutil" + +[dependencies.libimagbookmark] +path = "../libimagbookmark" + +[dependencies.libimagerror] +path = "../libimagerror" + +[dependencies.libimagentrylink] +path = "../libimagentrylink" + +[dependencies.libimagentrytag] +path = "../libimagentrytag" + diff --git a/imag-bookmark/src/main.rs b/imag-bookmark/src/main.rs new file mode 100644 index 00000000..2d003463 --- /dev/null +++ b/imag-bookmark/src/main.rs @@ -0,0 +1,120 @@ +extern crate clap; +#[macro_use] extern crate log; +#[macro_use] extern crate version; + +extern crate libimagbookmark; +extern crate libimagentrylink; +extern crate libimagentrytag; +extern crate libimagrt; +extern crate libimagerror; +extern crate libimagutil; + +use std::process::exit; + +use libimagentrytag::ui::{get_add_tags, get_remove_tags}; +use libimagentrylink::internal::Link; +use libimagrt::runtime::Runtime; +use libimagrt::setup::generate_runtime_setup; +use libimagbookmark::collection::BookmarkCollection; +use libimagbookmark::link::Link as BookmarkLink; +use libimagerror::trace::trace_error; + +mod ui; + +use ui::build_ui; + +fn main() { + let rt = generate_runtime_setup("imag-bookmark", + &version!()[..], + "Bookmark collection tool", + build_ui); + + rt.cli() + .subcommand_name() + .map(|name| { + debug!("Call {}", name); + match name { + "add" => add(&rt), + "collection" => collection(&rt), + "list" => list(&rt), + "remove" => remove(&rt), + _ => { + debug!("Unknown command"); // More error handling + }, + } + }); +} + +fn add(rt: &Runtime) { + let scmd = rt.cli().subcommand_matches("add").unwrap(); + let coll = scmd.value_of("collection").unwrap(); // enforced by clap + + BookmarkCollection::get(rt.store(), coll) + .map(|mut collection| { + for url in scmd.values_of("urls").unwrap() { // enforced by clap + collection.add_link(BookmarkLink::from(url)).map_err(|e| trace_error(&e)); + } + }); + info!("Ready"); +} + +fn collection(rt: &Runtime) { + let scmd = rt.cli().subcommand_matches("collection").unwrap(); + + if scmd.is_present("add") { // adding a new collection + let name = scmd.value_of("add").unwrap(); + if let Ok(_) = BookmarkCollection::new(rt.store(), name) { + info!("Created: {}", name); + } else { + warn!("Creating collection {} failed", name); + exit(1); + } + } + + if scmd.is_present("remove") { // remove a collection + let name = scmd.value_of("remove").unwrap(); + if let Ok(_) = BookmarkCollection::delete(rt.store(), name) { + info!("Deleted: {}", name); + } else { + warn!("Deleting collection {} failed", name); + exit(1); + } + } +} + +fn list(rt: &Runtime) { + let scmd = rt.cli().subcommand_matches("list").unwrap(); + let coll = scmd.value_of("collection").unwrap(); // enforced by clap + + BookmarkCollection::get(rt.store(), coll) + .map(|collection| { + match collection.links() { + Ok(links) => { + debug!("Listing..."); + for (i, link) in links.iter().enumerate() { + println!("{: >3}: {}", i, link); + }; + debug!("... ready with listing"); + }, + Err(e) => { + trace_error(&e); + exit(1); + }, + } + }); + info!("Ready"); +} + +fn remove(rt: &Runtime) { + let scmd = rt.cli().subcommand_matches("remove").unwrap(); + let coll = scmd.value_of("collection").unwrap(); // enforced by clap + + BookmarkCollection::get(rt.store(), coll) + .map(|mut collection| { + for url in scmd.values_of("urls").unwrap() { // enforced by clap + collection.remove_link(BookmarkLink::from(url)).map_err(|e| trace_error(&e)); + } + }); + info!("Ready"); +} + diff --git a/imag-bookmark/src/ui.rs b/imag-bookmark/src/ui.rs new file mode 100644 index 00000000..701cdbba --- /dev/null +++ b/imag-bookmark/src/ui.rs @@ -0,0 +1,100 @@ +use clap::{Arg, App, SubCommand}; + +use libimagentrytag::ui::tag_add_arg; + +pub fn build_ui<'a>(app: App<'a, 'a>) -> App<'a, 'a> { + app + .subcommand(SubCommand::with_name("add") + .about("Add bookmarks") + .version("0.1") + .arg(Arg::with_name("collection") + .long("collection") + .short("c") + .takes_value(true) + .required(true) + .multiple(false) + .value_name("COLLECTION") + .help("Add to this collection")) + .arg(Arg::with_name("urls") + .long("urls") + .short("u") + .takes_value(true) + .required(true) + .multiple(true) + .value_name("URL") + .help("Add this URL, multiple possible")) + .arg(tag_add_arg()) + ) + + .subcommand(SubCommand::with_name("remove") + .about("Remove bookmarks") + .version("0.1") + .arg(Arg::with_name("collection") + .long("collection") + .short("c") + .takes_value(true) + .required(true) + .multiple(false) + .value_name("COLLECTION") + .help("Remove from this collection")) + .arg(Arg::with_name("urls") + .long("urls") + .short("u") + .takes_value(true) + .required(true) + .multiple(true) + .value_name("URL") + .help("Remove these urls, regex supported")) + ) + + // .subcommand(SubCommand::with_name("open") + // .about("Open bookmarks (via xdg-open)") + // .version("0.1") + // .arg(Arg::with_name("collection") + // .long("collection") + // .short("c") + // .takes_value(true) + // .required(true) + // .multiple(false) + // .value_name("COLLECTION") + // .help("Select from this collection")) + // ) + + .subcommand(SubCommand::with_name("list") + .about("List bookmarks") + .version("0.1") + .arg(Arg::with_name("collection") + .long("collection") + .short("c") + .takes_value(true) + .required(true) + .multiple(false) + .value_name("COLLECTION") + .help("Select from this collection")) + .arg(Arg::with_name("tags") + .long("tags") + .short("t") + .takes_value(true) + .required(false) + .multiple(true) + .value_name("TAGS") + .help("Filter links to contain these tags. When multiple tags are specified, all of them must be set for the link to match.")) + ) + + .subcommand(SubCommand::with_name("collection") + .about("Collection commands") + .version("0.1") + .arg(Arg::with_name("add") + .long("add") + .short("a") + .takes_value(true) + .value_name("NAME") + .help("Add a collection with this name")) + .arg(Arg::with_name("remove") + .long("remove") + .short("r") + .takes_value(true) + .value_name("NAME") + .help("Remove a collection with this name (and all links)")) + ) +}