#![forbid(unsafe_code)]
#![allow(missing_docs)]
#![doc = "SZ-Rust 工作流引擎 — 状态机/审批流/插件节点编排"]
pub mod api;
pub mod config;
pub mod definition;
pub mod deps;
pub mod engine;
pub mod error;
pub mod guard;
pub mod instance;
pub mod integration;
pub mod observability;
pub mod repository;
pub mod scheduling;
pub use config::WorkflowConfig;
pub use definition::{
ApprovalStrategyType, CandidateStrategy, DefinitionFormat, DefinitionParser,
DefinitionValidator, FaultStrategy, FlowDefinition, IssueSeverity, NodeConfig, NodeType,
StateMachineDefinition, Transition, ValidationIssue,
};
pub use deps::{WorkflowDeps, WorkflowDepsBuilder};
pub use engine::WorkflowEngine;
pub use error::{WorkflowError, WorkflowErrorCode, WorkflowResult};
pub use instance::{
FlowInstance, HistoryEntry, InstanceStatus, PageRequest, PageResult, Task, TaskAction,
TaskStatus,
};
use axum::response::Json;
use serde_json::json;
use sz_rust_core::router::RouterBuilder;
#[derive(Clone)]
pub struct WorkflowState {
pub version: &'static str,
}
impl Default for WorkflowState {
fn default() -> Self {
Self {
version: env!("CARGO_PKG_VERSION"),
}
}
}
fn create_engine() -> WorkflowEngine {
let config = WorkflowConfig::default();
let deps = WorkflowDeps::default_for_test();
WorkflowEngine::new(config, deps)
}
pub fn register_routes<S>(builder: RouterBuilder<S>, state: WorkflowState) -> RouterBuilder<S>
where
S: Clone + Send + Sync + 'static,
{
let builder = builder.get("/api/workflow/health", {
let v = state.version;
move || async move {
let _engine = create_engine();
Json(json!({
"code": 1,
"msg": "success",
"data": {
"plugin": "workflow",
"status": "active",
"engine": "WorkflowEngine",
"version": v
}
}))
}
});
let builder = builder.get("/api/workflow/definitions", {
move || async move {
Json(json!({
"code": 1,
"msg": "success",
"data": {
"definitions": [],
"total": 0
}
}))
}
});
let builder = builder.get("/api/workflow/instances", {
move || async move {
let engine = create_engine();
let page = PageRequest::default();
let pending_tasks = engine
.query_tasks("", page)
.await
.map(|r| r.total)
.unwrap_or(0);
Json(json!({
"code": 1,
"msg": "success",
"data": {
"instances": [],
"total": 0,
"pending_tasks": pending_tasks
}
}))
}
});
builder
}
pub mod capability;
pub use capability::WorkflowPlugin;