acts-next 0.15.5

a fast, tiny, extensiable workflow engine
Documentation
use crate::{
    scheduler::{Context, TaskState},
    ActTask, Irq, Result,
};
use async_trait::async_trait;

#[async_trait]
impl ActTask for Irq {
    fn init(&self, ctx: &Context) -> Result<()> {
        let task = ctx.task();
        if self.key.is_empty() {
            return Err(crate::ActError::Action(format!(
                "cannot find 'key' in act '{}'",
                task.node.id
            )));
        }
        task.set_state(TaskState::Interrupt);
        Ok(())
    }

    fn review(&self, ctx: &Context) -> Result<bool> {
        let task = ctx.task();
        let state = task.state();
        if state.is_running() {
            let tasks = task.children();

            let mut count = 0;
            for t in tasks.iter() {
                if t.state().is_error() {
                    ctx.emit_error()?;
                    return Ok(false);
                }
                if t.state().is_skip() {
                    task.set_state(TaskState::Skipped);
                    return Ok(true);
                }

                if t.state().is_success() {
                    count += 1;
                }
            }

            if count == tasks.len() && !task.state().is_completed() {
                task.set_state(TaskState::Completed);
            }
        }

        Ok(true)
    }
}