Skip to main content

ps_promise/implementations/from/
task_failure.rs

1use crate::{Promise, State, TaskFailure};
2
3impl<T, E> From<TaskFailure> for Promise<T, E> {
4    /// Converts a [`TaskFailure`] into a failed promise.
5    ///
6    /// The failure is stored as is and mapped through
7    /// [`PromiseRejection::task_failed`](crate::PromiseRejection::task_failed)
8    /// on every consumption.
9    fn from(failure: TaskFailure) -> Self {
10        Self {
11            state: State::Failed(failure),
12        }
13    }
14}
15
16#[cfg(test)]
17mod tests {
18    use crate::{Promise, PromiseRejection, TaskFailure};
19
20    #[derive(Debug)]
21    enum E {
22        AlreadyConsumed,
23        TaskFailed(TaskFailure),
24    }
25
26    impl PromiseRejection for E {
27        fn already_consumed() -> Self {
28            Self::AlreadyConsumed
29        }
30
31        fn task_failed(failure: TaskFailure) -> Self {
32            Self::TaskFailed(failure)
33        }
34    }
35
36    #[test]
37    fn failure_becomes_failed() {
38        let promise: Promise<i32, E> = Promise::from(TaskFailure::Panic("boom".into()));
39
40        assert!(promise.is_failed());
41        assert!(promise.is_rejected());
42        assert!(!promise.is_pending());
43        assert!(!promise.is_resolved());
44    }
45
46    #[test]
47    fn consumption_maps_through_task_failed() {
48        let mut promise: Promise<i32, E> = Promise::from(TaskFailure::Panic("boom".into()));
49
50        match promise.consume() {
51            Some(Err(E::TaskFailed(failure @ TaskFailure::Panic(_)))) => {
52                assert_eq!(failure.to_string(), "task panicked: boom");
53            }
54            other => panic!("expected Err(TaskFailed(Panic(_))), got {other:?}"),
55        }
56    }
57
58    #[test]
59    fn failure_is_repeat_consumable() {
60        let mut promise: Promise<i32, E> = Promise::from(TaskFailure::Panic("boom".into()));
61
62        assert!(matches!(
63            promise.consume(),
64            Some(Err(E::TaskFailed(TaskFailure::Panic(_))))
65        ));
66        assert!(matches!(
67            promise.consume(),
68            Some(Err(E::TaskFailed(TaskFailure::Panic(_))))
69        ));
70    }
71}