ps_promise/implementations/from/
task_failure.rs1use crate::{Promise, State, TaskFailure};
2
3impl<T, E> From<TaskFailure> for Promise<T, E> {
4 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}