//! When MSRV is 1.48, replace with `core::future::Ready` and `core::future::ready()`. use core::{ future::Future, pin::Pin, task::{Context, Poll}, }; /// Future for the [`ready`](ready()) function. #[derive(Debug, Clone)] #[must_use = "futures do nothing unless you `.await` or poll them"] pub struct Ready { val: Option, } impl Ready { /// Unwraps the value from this immediately ready future. #[inline] pub fn into_inner(mut self) -> T { self.val.take().unwrap() } } impl Unpin for Ready {} impl Future for Ready { type Output = T; #[inline] fn poll(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll { let val = self.val.take().expect("Ready can not be polled twice."); Poll::Ready(val) } } /// Creates a future that is immediately ready with a value. #[allow(dead_code)] pub(crate) fn ready(val: T) -> Ready { Ready { val: Some(val) } } /// Create a future that is immediately ready with a success value. #[allow(dead_code)] pub(crate) fn ok(val: T) -> Ready> { Ready { val: Some(Ok(val)) } } /// Create a future that is immediately ready with an error value. #[allow(dead_code)] pub(crate) fn err(err: E) -> Ready> { Ready { val: Some(Err(err)), } }