summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2019-11-11 19:46:09 +0100
committerMatthias Beyer <mail@beyermatthias.de>2019-11-11 19:50:38 +0100
commitfae53aa134c06a208a5bf24913674cf600829cc3 (patch)
tree3f91578f5f31beae927f7bb6b619a3f787fe9a2d
parent9dc345c83383ca5caf1f805d6546d3ae433ba815 (diff)
Rewrite to accept ids from stdin
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r--bin/core/imag-tag/Cargo.toml1
-rw-r--r--bin/core/imag-tag/src/lib.rs78
2 files changed, 48 insertions, 31 deletions
diff --git a/bin/core/imag-tag/Cargo.toml b/bin/core/imag-tag/Cargo.toml
index bafc7b0b..125ec822 100644
--- a/bin/core/imag-tag/Cargo.toml
+++ b/bin/core/imag-tag/Cargo.toml
@@ -23,6 +23,7 @@ maintenance = { status = "actively-developed" }
log = "0.4.6"
toml = "0.5.1"
failure = "0.1.5"
+resiter = "0.4.0"
libimagstore = { version = "0.10.0", path = "../../../lib/core/libimagstore" }
libimagrt = { version = "0.10.0", path = "../../../lib/core/libimagrt" }
diff --git a/bin/core/imag-tag/src/lib.rs b/bin/core/imag-tag/src/lib.rs
index 1a2a2b8e..83f58722 100644
--- a/bin/core/imag-tag/src/lib.rs
+++ b/bin/core/imag-tag/src/lib.rs
@@ -35,6 +35,7 @@
)]
extern crate clap;
+extern crate resiter;
#[macro_use] extern crate log;
#[cfg(test)] extern crate toml;
@@ -63,6 +64,8 @@ use std::io::Write;
use failure::Fallible as Result;
use failure::Error;
use failure::err_msg;
+use resiter::AndThen;
+use resiter::Map;
use libimagrt::runtime::Runtime;
use libimagrt::application::ImagApplication;
@@ -82,39 +85,52 @@ mod ui;
pub enum ImagTag {}
impl ImagApplication for ImagTag {
fn run(rt: Runtime) -> Result<()> {
- let ids = rt.ids::<crate::ui::PathProvider>()?
- .ok_or_else(|| err_msg("No ids supplied"))?
- .into_iter();
-
- if let Some(name) = rt.cli().subcommand_name() {
- match name {
- "list" => ids.into_iter().map(|id| list(id, &rt)).collect(),
-
- "remove" => ids.into_iter().map(|id| {
- let add = None;
- let rem = get_remove_tags(rt.cli())?;
- debug!("id = {:?}, add = {:?}, rem = {:?}", id, add, rem);
- alter(&rt, id, add, rem)
- }).collect(),
-
- "add" => ids.into_iter().map(|id| {
- let add = get_add_tags(rt.cli())?;
- let rem = None;
- debug!("id = {:?}, add = {:?}, rem = {:?}", id, add, rem);
- alter(&rt, id, add, rem)
- }).collect(),
-
- other => {
- debug!("Unknown command");
- if rt.handle_unknown_subcommand("imag-tag", other, rt.cli())?.success() {
- Ok(())
- } else {
- Err(format_err!("Subcommand failed"))
- }
- },
+ let process = |iter: &mut dyn Iterator<Item = Result<StoreId>>| -> Result<()> {
+ if let Some(name) = rt.cli().subcommand_name() {
+ match name {
+ "list" => iter
+ .map_ok(|id| list(id, &rt))
+ .collect::<Result<Vec<_>>>()
+ .map(|_| ()),
+
+ "remove" => iter.and_then_ok(|id| {
+ let add = None;
+ let rem = get_remove_tags(rt.cli())?;
+ debug!("id = {:?}, add = {:?}, rem = {:?}", id, add, rem);
+ alter(&rt, id, add, rem)
+ }).collect(),
+
+ "add" => iter.and_then_ok(|id| {
+ let add = get_add_tags(rt.cli())?;
+ let rem = None;
+ debug!("id = {:?}, add = {:?}, rem = {:?}", id, add, rem);
+ alter(&rt, id, add, rem)
+ }).collect(),
+
+ other => {
+ debug!("Unknown command");
+ if rt.handle_unknown_subcommand("imag-tag", other, rt.cli())?.success() {
+ Ok(())
+ } else {
+ Err(format_err!("Subcommand failed"))
+ }
+ },
+ }
+ } else {
+ Ok(())
}
+ };
+
+ if rt.ids_from_stdin() {
+ debug!("Fetching IDs from stdin...");
+ let mut iter = rt.ids::<crate::ui::PathProvider>()?
+ .ok_or_else(|| err_msg("No ids supplied"))?
+ .into_iter()
+ .map(Ok);
+
+ process(&mut iter)
} else {
- Ok(())
+ process(&mut rt.store().entries()?)
}
}