acts 0.17.2

a fast, lightweight, extensiable workflow engine
Documentation
use crate::{
    Context, Executor, Result, Vars,
    package::{
        ActPackage, ActPackageCatalog, ActPackageFn, ActPackageMeta, ActPackageRegister, ActRunAs,
    },
    utils::{self, consts},
};
use serde::{Deserialize, Serialize};
use serde_json::json;

#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct SubflowPackage {
    pub to: String,

    #[serde(default)]
    pub options: Vars,
}

impl ActPackage for SubflowPackage {
    fn meta() -> ActPackageMeta {
        ActPackageMeta {
            name: "acts.core.subflow",
            desc: "call a subflow",
            version: "0.1.0",
            icon: "icon-subflow",
            doc: "",
            schema: json!({
                "type": "object",
                "properties": {
                    "to": { "type": "string" },
                    "options": { "type": "object"}
                }
            }),
            run_as: ActRunAs::Func,
            resources: vec![],
            catalog: ActPackageCatalog::Core,
        }
    }
}

impl ActPackageFn for SubflowPackage {
    fn execute(&self, ctx: &Context) -> Result<Option<Vars>> {
        let task = ctx.task();
        task.set_auto_complete(false);

        let executor = Executor::new(&ctx.runtime);

        let mut inputs = utils::fill_inputs(&self.options, ctx);
        inputs.set(consts::ACT_USE_PARENT_PROC_ID, &ctx.proc.id());
        inputs.set(consts::ACT_USE_PARENT_TASK_ID, &task.id);
        executor.proc().start(&self.to, &inputs)?;

        Ok(None)
    }
}

inventory::submit!(ActPackageRegister::new::<SubflowPackage>());

#[cfg(test)]
mod tests {
    use crate::ActPackage;

    #[test]
    fn pack_subflow_parse() {
        let params = r#"
        to: sub1
        options:
            a: abc
            b: 1
        "#;

        let value = serde_yaml::from_str::<serde_json::Value>(params).unwrap();
        let meta = super::SubflowPackage::meta();
        serde_json::from_value::<super::SubflowPackage>(value.clone()).unwrap();
        jsonschema::validate(&meta.schema, &value).unwrap()
    }
}