| 1 | /// Extracts the successful type of a [`Poll<T>`]. |
| 2 | /// |
| 3 | /// This macro bakes in propagation of [`Pending`] signals by returning early. |
| 4 | /// |
| 5 | /// [`Poll<T>`]: crate::task::Poll |
| 6 | /// [`Pending`]: crate::task::Poll::Pending |
| 7 | /// |
| 8 | /// # Examples |
| 9 | /// |
| 10 | /// ``` |
| 11 | /// use std::task::{ready, Context, Poll}; |
| 12 | /// use std::future::{self, Future}; |
| 13 | /// use std::pin::Pin; |
| 14 | /// |
| 15 | /// pub fn do_poll(cx: &mut Context<'_>) -> Poll<()> { |
| 16 | /// let mut fut = future::ready(42); |
| 17 | /// let fut = Pin::new(&mut fut); |
| 18 | /// |
| 19 | /// let num = ready!(fut.poll(cx)); |
| 20 | /// # let _ = num; |
| 21 | /// // ... use num |
| 22 | /// |
| 23 | /// Poll::Ready(()) |
| 24 | /// } |
| 25 | /// ``` |
| 26 | /// |
| 27 | /// The `ready!` call expands to: |
| 28 | /// |
| 29 | /// ``` |
| 30 | /// # use std::task::{Context, Poll}; |
| 31 | /// # use std::future::{self, Future}; |
| 32 | /// # use std::pin::Pin; |
| 33 | /// # |
| 34 | /// # pub fn do_poll(cx: &mut Context<'_>) -> Poll<()> { |
| 35 | /// # let mut fut = future::ready(42); |
| 36 | /// # let fut = Pin::new(&mut fut); |
| 37 | /// # |
| 38 | /// let num = match fut.poll(cx) { |
| 39 | /// Poll::Ready(t) => t, |
| 40 | /// Poll::Pending => return Poll::Pending, |
| 41 | /// }; |
| 42 | /// # let _ = num; // to silence unused warning |
| 43 | /// # // ... use num |
| 44 | /// # |
| 45 | /// # Poll::Ready(()) |
| 46 | /// # } |
| 47 | /// ``` |
| 48 | #[stable (feature = "ready_macro" , since = "1.64.0" )] |
| 49 | #[rustc_macro_transparency = "semitransparent" ] |
| 50 | pub macro ready($e:expr) { |
| 51 | match $e { |
| 52 | $crate::task::Poll::Ready(t) => t, |
| 53 | $crate::task::Poll::Pending => { |
| 54 | return $crate::task::Poll::Pending; |
| 55 | } |
| 56 | } |
| 57 | } |
| 58 | |