From bd4a839cb96304f4fd049abb3fc4727111a494ae Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sun, 10 Nov 2019 22:24:58 +0100 Subject: [PATCH] Rewrite list_todos() to be able to read ids from stdin Signed-off-by: Matthias Beyer --- bin/domain/imag-todo/src/lib.rs | 78 ++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 30 deletions(-) diff --git a/bin/domain/imag-todo/src/lib.rs b/bin/domain/imag-todo/src/lib.rs index 1ee53439..d3c3fe51 100644 --- a/bin/domain/imag-todo/src/lib.rs +++ b/bin/domain/imag-todo/src/lib.rs @@ -251,15 +251,6 @@ fn list_todos(rt: &Runtime, matcher: &StatusMatcher, show_hidden: bool) -> Resul use filters::failable::filter::FailableFilter; debug!("Listing todos with status filter {:?}", matcher); - let now = { - let now = chrono::offset::Local::now(); - NaiveDateTime::new(now.date().naive_local(), now.time()) - }; - - let filter_hidden = |todo: &FileLockEntry<'_>| -> Result { - Ok(todo.get_hidden()?.map(|hid| hid > now).unwrap_or(true)) - }; - struct TodoViewer { details: bool, } @@ -306,30 +297,57 @@ fn list_todos(rt: &Runtime, matcher: &StatusMatcher, show_hidden: bool) -> Resul } } - let viewer = TodoViewer { details: false }; + fn process<'a, I>(rt: &Runtime, matcher: &StatusMatcher, show_hidden: bool, iter: I) -> Result<()> + where I: Iterator>> + Sized + { + let viewer = TodoViewer { details: false }; - rt.store() - .get_todos()? - .into_get_iter() - .map_inner_ok_or_else(|| err_msg("Did not find one entry")) - .filter_map(|r| { - match r.and_then(|e| e.get_status().map(|s| (s, e))) { - Err(e) => Some(Err(e)), - Ok((st, e)) => if matcher.matches(st) { - Some(Ok(e)) - } else { - None + let now = { + let now = chrono::offset::Local::now(); + NaiveDateTime::new(now.date().naive_local(), now.time()) + }; + + let filter_hidden = |todo: &FileLockEntry<'_>| -> Result { + Ok(todo.get_hidden()?.map(|hid| hid > now).unwrap_or(true)) + }; + + iter + .filter_map(|r| { + match r.and_then(|e| e.get_status().map(|s| (s, e))) { + Err(e) => Some(Err(e)), + Ok((st, e)) => if matcher.matches(st) { + Some(Ok(e)) + } else { + None + } + } + }) + .and_then_ok(|entry| { + if !rt.output_is_pipe() && (show_hidden || filter_hidden.filter(&entry)?) { + viewer.view_entry(&entry, &mut rt.stdout())?; } - } - }) - .and_then_ok(|entry| { - if !rt.output_is_pipe() && (show_hidden || filter_hidden.filter(&entry)?) { - viewer.view_entry(&entry, &mut rt.stdout())?; - } - rt.report_touched(entry.get_location()).map_err(Error::from) - }) - .collect() + rt.report_touched(entry.get_location()).map_err(Error::from) + }) + .collect() + }; + + if rt.ids_from_stdin() { + let iter = rt.ids::()? + .ok_or_else(|| err_msg("No ids supplied"))? + .into_iter() + .map(Ok) + .into_get_iter(rt.store()) + .map_inner_ok_or_else(|| err_msg("Did not find one entry")); + + process(&rt, matcher, show_hidden, iter) + } else { + let iter = rt.store().get_todos()? + .into_get_iter() + .map_inner_ok_or_else(|| err_msg("Did not find one entry")); + + process(&rt, matcher, show_hidden, iter) + } } /// Generic todo items list function