yao 0.1.4

a fast, tiny, extensiable workflow engine
Documentation
use crate::{
    model::Branch,
    sch::{Context, TaskState},
    ActError, ActTask,
};
use async_trait::async_trait;
use core::clone::Clone;

impl_act_state!(Branch);
impl_act_time!(Branch);
impl_act_id!(Branch);

impl Branch {
    pub(in crate::sch) fn check_pass(&self, ctx: &Context) -> bool {
        match &self.accept {
            Some(m) => {
                if m.is_sequence() {
                    let seq = m.as_sequence().unwrap();
                    return seq.iter().all(|evt| {
                        let key = evt.as_str().unwrap();
                        ctx.user_data().action == key
                    });
                }

                true
            }
            None => true,
        }
    }
}

#[async_trait]
impl ActTask for Branch {
    fn run(&self, ctx: &Context) {
        if let Some(expr) = &self.r#if {
            match ctx.eval(expr) {
                Ok(cond) => {
                    if cond {
                        self.set_state(&TaskState::Success);
                    } else {
                        self.set_state(&TaskState::Skip);
                    }
                }
                Err(err) => self.set_state(&TaskState::Fail(err.into())),
            }
        } else {
            self.set_state(&TaskState::Fail(ActError::BranchIfError.into()));
        }
    }
}