Skip to main content

ps_promise/methods/
consume.rs

1use std::mem::replace;
2
3use crate::{Promise, PromiseRejection};
4
5impl<T, E> Promise<T, E>
6where
7    T: Unpin,
8    E: PromiseRejection,
9{
10    /// If settled, consumes and returns the result.
11    /// Returns `None` if still pending.
12    pub fn consume(&mut self) -> Option<Result<T, E>> {
13        match replace(self, Self::Consumed) {
14            Self::Resolved(val) => Some(Ok(val)),
15            Self::Rejected(err) => Some(Err(err)),
16            Self::Consumed => Some(Err(E::already_consumed())),
17            other @ Self::Pending(_) => {
18                *self = other;
19                None
20            }
21        }
22    }
23}