rust-viewflow 0.1.0

Rust workflow library inspired by Viewflow, compatible with Axum and Actix-web
Documentation
use std::sync::Arc;

use rust_viewflow::{
    CreateWorkflowRequest, DefaultWorkflowApi, DefaultWorkflowEngine, LeaveRequestWorkflow,
    MemoryDatabase, WorkflowApi, WorkflowStatus,
};

#[tokio::test]
async fn leave_request_multi_stage_flow_works() {
    let db = Arc::new(MemoryDatabase::new());
    let engine = Arc::new(DefaultWorkflowEngine::new(db.clone()));
    engine.register_workflow(Arc::new(LeaveRequestWorkflow::new(db.clone())));

    let api = DefaultWorkflowApi::new(engine);

    let created = api
        .create_workflow(CreateWorkflowRequest {
            workflow_type: "leave_request".to_string(),
            data: serde_json::json!({
                "employee_id": "emp-100",
                "manager_id": "mgr-100",
                "hr_id": "hr-100",
                "start_date": "2026-03-01",
                "end_date": "2026-03-03",
                "reason": "medical leave",
                "locale": "zh-CN"
            }),
        })
        .await
        .expect("workflow should be created");

    assert_eq!(created.name, "leave_request");

    let first_tasks = api
        .get_tasks(&created.id)
        .await
        .expect("tasks should exist after create");

    assert_eq!(first_tasks.len(), 1);
    assert_eq!(first_tasks[0].name, "直属经理审批");

    api.complete_task(
        &first_tasks[0].id,
        rust_viewflow::CompleteTaskRequest {
            data: serde_json::json!({"approved": true, "locale": "zh-CN"}),
        },
    )
    .await
    .expect("manager task should complete");

    let second_tasks = api
        .get_tasks(&created.id)
        .await
        .expect("hr task should be created");

    assert_eq!(second_tasks.len(), 2);
    let hr_task = second_tasks
        .iter()
        .find(|task| task.name == "HR 备案")
        .expect("hr task should exist");

    api.complete_task(
        &hr_task.id,
        rust_viewflow::CompleteTaskRequest {
            data: serde_json::json!({"approved": true, "locale": "zh-CN"}),
        },
    )
    .await
    .expect("hr task should complete");

    let workflow = api
        .get_workflow(&created.id)
        .await
        .expect("workflow should be queryable");

    assert_eq!(workflow.status, WorkflowStatus::Completed);
}