mod private {
pub trait Sealed {}
impl<S, E> Sealed for Result<S, E> {}
}
pub trait ResultExt: private::Sealed {
type Ok;
type Err;
fn into_result(self) -> Result<Self::Ok, Self::Err>
where
Self: Sized;
fn lift_future(self) -> futures::future::Ready<Result<Self::Ok, Self::Err>>
where
Self: Sized,
{
futures::future::ready(self.into_result())
}
fn unwrap_infallible(self) -> Self::Ok
where
Self: Sized + ResultExt<Err = std::convert::Infallible>,
{
let as_result: Result<_, std::convert::Infallible> = self.into_result();
match as_result {
Ok(ok) => ok,
#[allow(unreachable_patterns, dead_code)]
Err(e) => match e {},
}
}
}
impl<S, E> ResultExt for Result<S, E> {
type Ok = S;
type Err = E;
fn into_result(self) -> Result<S, E>
where
Self: Sized,
{
self
}
}
#[cfg(test)]
mod tests {
use std::convert::Infallible;
use futures::{
future::{ready, AndThen},
TryFutureExt,
};
use super::ResultExt;
#[tokio::test]
async fn lift_future() {
let initial = Result::<u32, Infallible>::Ok(42);
let futurized = initial.lift_future();
let bound: AndThen<_, _, _> = futurized.and_then(|x| ready(Ok(x)));
let res = bound.await;
assert_eq!(res, Ok(42));
}
}