acts-next 0.14.2

a fast, tiny, extensiable workflow engine
Documentation
use acts_next::{data::Package, Engine, Vars, Workflow};

#[tokio::main]
async fn main() {
    let engine = Engine::new();

    let (s1, s2, sig) = engine.signal(()).triple();
    let executor = engine.executor();

    let data = include_str!("./pack1.js");
    let pack = Package {
        id: "pack1".to_string(),
        name: "package 1".to_string(),
        size: data.len() as u32,
        data: data.as_bytes().to_vec(),
        ..Default::default()
    };
    engine
        .executor()
        .pack()
        .publish(&pack)
        .expect("publish pack1");

    let data = include_str!("./pack2.js");
    let pack = Package {
        id: "pack2".to_string(),
        name: "package 2".to_string(),
        size: data.len() as u32,
        data: data.as_bytes().to_vec(),
        ..Default::default()
    };
    engine
        .executor()
        .pack()
        .publish(&pack)
        .expect("publish pack2");

    let mut vars = Vars::new();
    vars.insert("input".into(), 10.into());

    let text = include_str!("./model.yml");
    let workflow = Workflow::from_yml(text).unwrap();
    engine.executor().model().deploy(&workflow).unwrap();

    executor
        .proc()
        .start(&workflow.id, &vars)
        .expect("start workflow");
    let emitter = engine.channel();
    emitter.on_message(move |e| {
        println!("on_message: e={:?}", e);
    });
    emitter.on_complete(move |e| {
        println!(
            "on_workflow_complete: state={} cost={}ms output={:?}",
            e.state,
            e.cost(),
            e.outputs
        );
        s1.close();
    });
    emitter.on_error(move |e| {
        println!("on_error: state={}", e.state,);
        s2.close();
    });
    sig.recv().await;
}