#![deny(missing_docs)]
#![doc(html_root_url = "http://arcnmx.github.io/result-rs/")]
pub mod prelude {
pub use super::{ResultOptionExt, ResultIteratorExt};
}
pub use ::ResultOptionExt as OptionResultExt;
pub trait ResultOptionExt {
type Out;
fn invert(self) -> Self::Out;
}
impl<T, E> OptionResultExt for Option<Result<T, E>> {
type Out = Result<Option<T>, E>;
fn invert(self) -> Self::Out {
match self {
Some(Err(e)) => Err(e),
Some(Ok(v)) => Ok(Some(v)),
None => Ok(None)
}
}
}
impl<T, E> ResultOptionExt for Result<Option<T>, E> {
type Out = Option<Result<T, E>>;
fn invert(self) -> Self::Out {
match self {
Ok(None) => None,
Ok(Some(v)) => Some(Ok(v)),
Err(e) => Some(Err(e)),
}
}
}
pub trait ResultIteratorExt {
type Val;
type Err;
fn next_invert(&mut self) -> Result<Option<Self::Val>, Self::Err>;
}
impl<T, E, I: Iterator<Item=Result<T, E>>> ResultIteratorExt for I {
type Val = T;
type Err = E;
fn next_invert(&mut self) -> Result<Option<Self::Val>, Self::Err> {
self.next().invert()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_option_result() {
use std::iter;
let mut iter = iter::once(Err::<(), _>(0));
let err = iter.next();
assert!(err.invert().is_err());
assert_eq!(err.invert().invert(), err);
let none = iter.next();
assert_eq!(none.invert(), Ok(None));
assert_eq!(none.invert().invert(), none);
}
}