crb_task/performers/
interrupt_performer.rs1use crate::hybryd_task::{HybrydSession, HybrydTask, NextState, StatePerformer, Transition};
2use anyhow::Error;
3use async_trait::async_trait;
4
5impl<T> NextState<T>
6where
7 T: HybrydTask,
8{
9 pub fn done() -> Self {
10 Self::interrupt(None)
11 }
12
13 pub fn fail(err: Error) -> Self {
14 Self::interrupt(Some(err))
15 }
16
17 pub(crate) fn interrupt(error: Option<Error>) -> Self {
18 Self::new(InterruptPerformer { error })
19 }
20}
21
22pub struct InterruptPerformer {
23 error: Option<Error>,
24}
25
26#[async_trait]
27impl<T> StatePerformer<T> for InterruptPerformer
28where
29 T: HybrydTask,
30{
31 async fn perform(&mut self, _task: T, _session: &mut HybrydSession) -> Transition<T> {
32 match self.error.take() {
33 None => Transition::Interrupted,
34 Some(err) => Transition::Crashed(err),
35 }
36 }
37
38 async fn fallback(&mut self, task: T, err: Error) -> (T, NextState<T>) {
39 let error = self.error.take().unwrap_or(err);
40 (task, NextState::interrupt(Some(error)))
41 }
42}