Merge pull request #522 from matthiasbeyer/imag-bookmark/init

imag-bookmark/init
This commit is contained in:
Matthias Beyer 2016-07-15 14:33:14 +02:00 committed by GitHub
commit 5a4e6b4af6
3 changed files with 248 additions and 0 deletions

28
imag-bookmark/Cargo.toml Normal file
View file

@ -0,0 +1,28 @@
[package]
name = "imag-bookmark"
version = "0.1.0"
authors = ["Matthias Beyer <mail@beyermatthias.de>"]
[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"

120
imag-bookmark/src/main.rs Normal file
View file

@ -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");
}

100
imag-bookmark/src/ui.rs Normal file
View file

@ -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)"))
)
}