Merge pull request #1256 from matthiasbeyer/libimagerror/trace-iterators

Add TraceIterator::trace_unwrap_exit()
This commit is contained in:
Matthias Beyer 2018-02-10 23:26:27 +01:00 committed by GitHub
commit 17b59599c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 41 additions and 0 deletions

View File

@ -118,6 +118,33 @@ impl<I, F, T, E> DoubleEndedIterator for UnwrapWith<I, F> where
} }
} }
/// Iterator helper for Unwrap with exiting on error
pub struct UnwrapExit<I, T, E>(I, i32)
where I: Iterator<Item = Result<T, E>>,
E: Error;
impl<I, T, E> Iterator for UnwrapExit<I, T, E>
where I: Iterator<Item = Result<T, E>>,
E: Error
{
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
use trace::MapErrTrace;
self.0.next().map(|e| e.map_err_trace_exit_unwrap(self.1))
}
}
impl<I, T, E> DoubleEndedIterator for UnwrapExit<I, T, E>
where I: DoubleEndedIterator<Item = Result<T, E>>,
E: Error
{
fn next_back(&mut self) -> Option<Self::Item> {
use trace::MapErrTrace;
self.0.next_back().map(|e| e.map_err_trace_exit_unwrap(self.1))
}
}
/// This trait provides methods that make it easier to work with iterators that yield a `Result`. /// This trait provides methods that make it easier to work with iterators that yield a `Result`.
pub trait TraceIterator<T, E> : Iterator<Item = Result<T, E>> + Sized { pub trait TraceIterator<T, E> : Iterator<Item = Result<T, E>> + Sized {
/// Creates an iterator that yields the item in each `Ok` item, while filtering out the `Err` /// Creates an iterator that yields the item in each `Ok` item, while filtering out the `Err`
@ -136,6 +163,20 @@ pub trait TraceIterator<T, E> : Iterator<Item = Result<T, E>> + Sized {
self.unwrap_with(trace_error) self.unwrap_with(trace_error)
} }
/// Creates an iterator that yields the item in each `Ok` item.
///
/// The first `Err(_)` element is traced using `::trace::trace_error_exit`.
///
/// As with all iterators, the processing is lazy. If you do not use the result of this method,
/// nothing will be passed to `::trace::trace_error_exit`, no matter how many `Err` items might
/// be present.
#[inline]
fn trace_unwrap_exit(self, exitcode: i32) -> UnwrapExit<Self, T, E>
where E: Error
{
UnwrapExit(self, exitcode)
}
/// Takes a closure and creates an iterator that will call that closure for each `Err` element. /// Takes a closure and creates an iterator that will call that closure for each `Err` element.
/// The resulting iterator will yield the exact same items as the original iterator. A close /// The resulting iterator will yield the exact same items as the original iterator. A close
/// analogue from the standard library would be `Iterator::inspect`. /// analogue from the standard library would be `Iterator::inspect`.