From 91901fac9659694d6074ef3a3e2613d60c27088d Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sun, 1 Mar 2020 17:52:44 +0100 Subject: Add viewer for viewing all entries from an iterator Signed-off-by: Matthias Beyer --- lib/entry/libimagentryview/src/viewer.rs | 66 ++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/lib/entry/libimagentryview/src/viewer.rs b/lib/entry/libimagentryview/src/viewer.rs index 902c9b7f..ca599e15 100644 --- a/lib/entry/libimagentryview/src/viewer.rs +++ b/lib/entry/libimagentryview/src/viewer.rs @@ -21,6 +21,7 @@ use std::io::Write; use std::ops::Deref; use libimagstore::store::Entry; +use libimagstore::store::FileLockEntry; use crate::error::Result; @@ -76,3 +77,68 @@ impl ViewFromIter for I } } +pub trait IntoViewIter + where Self: Iterator + Sized, + V: Viewer, + W: Write, + F: Fn(&T) -> Option<&FileLockEntry>, + T: Sized, +{ + fn view_all_if(self, v: V, sink: &mut W, func: F) -> ViewIter { + ViewIter { + inner: self, + viewer: v, + func, + sink, + } + } +} + +impl IntoViewIter for I + where I: Iterator, + V: Viewer, + W: Write, + F: Fn(&T) -> Option<&FileLockEntry>, + T: Sized, +{ + // default impl +} + + +pub struct ViewIter<'a, I, V, W, F, T> + where I: Iterator, + V: Viewer, + W: Write, + F: Fn(&T) -> Option<&FileLockEntry>, + T: Sized, +{ + inner: I, + viewer: V, + func: F, + sink: &'a mut W +} + +impl<'a, I, V, W, F, T> Iterator for ViewIter<'a, I, V, W, F, T> + where I: Iterator, + V: Viewer, + W: Write, + F: Fn(&T) -> Option<&FileLockEntry>, + T: Sized, +{ + type Item = failure::Fallible; + + fn next(&mut self) -> Option { + if let Some(next) = self.inner.next() { + if let Some(entry) = (self.func)(&next) { + if let Err(e) = self.viewer.view_entry(&entry, self.sink) { + return Some(Err(e).map_err(failure::Error::from)) + } + } + + return Some(Ok(next)) + } + + None + } +} + -- cgit v1.2.3