use core::convert; use core::fmt; use core::ops::{ControlFlow, FromResidual, Try}; use core::task::Poll; /// Extracts the successful type of a [`Poll`]. /// /// This macro bakes in propagation of [`Pending`] signals by returning early. /// /// [`Poll`]: crate::task::Poll /// [`Pending`]: crate::task::Poll::Pending /// /// # Examples /// /// ``` /// use std::task::{ready, Context, Poll}; /// use std::future::{self, Future}; /// use std::pin::Pin; /// /// pub fn do_poll(cx: &mut Context<'_>) -> Poll<()> { /// let mut fut = future::ready(42); /// let fut = Pin::new(&mut fut); /// /// let num = ready!(fut.poll(cx)); /// # drop(num); /// // ... use num /// /// Poll::Ready(()) /// } /// ``` /// /// The `ready!` call expands to: /// /// ``` /// # use std::task::{Context, Poll}; /// # use std::future::{self, Future}; /// # use std::pin::Pin; /// # /// # pub fn do_poll(cx: &mut Context<'_>) -> Poll<()> { /// # let mut fut = future::ready(42); /// # let fut = Pin::new(&mut fut); /// # /// let num = match fut.poll(cx) { /// Poll::Ready(t) => t, /// Poll::Pending => return Poll::Pending, /// }; /// # drop(num); /// # // ... use num /// # /// # Poll::Ready(()) /// # } /// ``` #[stable(feature = "ready_macro", since = "1.64.0")] #[rustc_macro_transparency = "semitransparent"] pub macro ready($e:expr) { match $e { $crate::task::Poll::Ready(t) => t, $crate::task::Poll::Pending => { return $crate::task::Poll::Pending; } } } /// Extracts the successful type of a [`Poll`]. /// /// See [`Poll::ready`] for details. #[unstable(feature = "poll_ready", issue = "89780")] pub struct Ready(pub(crate) Poll); #[unstable(feature = "poll_ready", issue = "89780")] impl Try for Ready { type Output = T; type Residual = Ready; #[inline] fn from_output(output: Self::Output) -> Self { Ready(Poll::Ready(output)) } #[inline] fn branch(self) -> ControlFlow { match self.0 { Poll::Ready(v) => ControlFlow::Continue(v), Poll::Pending => ControlFlow::Break(Ready(Poll::Pending)), } } } #[unstable(feature = "poll_ready", issue = "89780")] impl FromResidual for Ready { #[inline] fn from_residual(residual: Ready) -> Self { match residual.0 { Poll::Pending => Ready(Poll::Pending), } } } #[unstable(feature = "poll_ready", issue = "89780")] impl FromResidual> for Poll { #[inline] fn from_residual(residual: Ready) -> Self { match residual.0 { Poll::Pending => Poll::Pending, } } } #[unstable(feature = "poll_ready", issue = "89780")] impl fmt::Debug for Ready { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_tuple("Ready").finish() } }