crb_task/performers/
interrupt_performer.rs

1use 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}