rust-viewflow 0.1.0

Rust workflow library inspired by Viewflow, compatible with Axum and Actix-web
Documentation
use async_trait::async_trait;
use chrono;
use serde::{Deserialize, Serialize};
use serde_json;

pub type WorkflowResult<T> = Result<T, Box<dyn std::error::Error + Send + Sync>>;

/// Workflow state representation
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct WorkflowState {
    pub id: String,
    pub name: String,
    pub status: WorkflowStatus,
    pub data: serde_json::Value,
    pub created_at: chrono::DateTime<chrono::Utc>,
    pub updated_at: chrono::DateTime<chrono::Utc>,
}

/// Workflow status enumeration
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum WorkflowStatus {
    Pending,
    Running,
    Completed,
    Failed,
    Cancelled,
}

/// Task state representation
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct TaskState {
    pub id: String,
    pub workflow_id: String,
    pub name: String,
    pub status: TaskStatus,
    pub assignee: Option<String>,
    pub data: serde_json::Value,
    pub created_at: chrono::DateTime<chrono::Utc>,
    pub updated_at: chrono::DateTime<chrono::Utc>,
    pub completed_at: Option<chrono::DateTime<chrono::Utc>>,
}

/// Task status enumeration
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum TaskStatus {
    Pending,
    Assigned,
    InProgress,
    Completed,
    Failed,
    Cancelled,
}

/// Workflow definition trait
#[async_trait]
pub trait WorkflowDefinition: Send + Sync {
    fn name(&self) -> &str;
    async fn start(&self, data: serde_json::Value) -> WorkflowResult<WorkflowState>;
    async fn execute_task(
        &self,
        task_id: &str,
        data: serde_json::Value,
    ) -> WorkflowResult<TaskState>;
    async fn get_tasks(&self, workflow_id: &str) -> WorkflowResult<Vec<TaskState>>;
}

/// Workflow engine trait
#[async_trait]
pub trait WorkflowEngine: Send + Sync {
    async fn create_workflow(
        &self,
        definition_name: &str,
        data: serde_json::Value,
    ) -> WorkflowResult<WorkflowState>;
    async fn get_workflow(&self, workflow_id: &str) -> WorkflowResult<WorkflowState>;
    async fn update_workflow(
        &self,
        workflow_id: &str,
        data: serde_json::Value,
    ) -> WorkflowResult<WorkflowState>;
    async fn complete_task(
        &self,
        task_id: &str,
        data: serde_json::Value,
    ) -> WorkflowResult<TaskState>;
    async fn get_tasks(&self, workflow_id: &str) -> WorkflowResult<Vec<TaskState>>;
}