Skip to main content

rust_viewflow/core/
workflow.rs

1use async_trait::async_trait;
2use chrono;
3use serde::{Deserialize, Serialize};
4use serde_json;
5
6pub type WorkflowResult<T> = Result<T, Box<dyn std::error::Error + Send + Sync>>;
7
8/// Workflow state representation
9#[derive(Debug, Serialize, Deserialize, Clone)]
10pub struct WorkflowState {
11    pub id: String,
12    pub name: String,
13    pub status: WorkflowStatus,
14    pub data: serde_json::Value,
15    pub created_at: chrono::DateTime<chrono::Utc>,
16    pub updated_at: chrono::DateTime<chrono::Utc>,
17}
18
19/// Workflow status enumeration
20#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
21pub enum WorkflowStatus {
22    Pending,
23    Running,
24    Completed,
25    Failed,
26    Cancelled,
27}
28
29/// Task state representation
30#[derive(Debug, Serialize, Deserialize, Clone)]
31pub struct TaskState {
32    pub id: String,
33    pub workflow_id: String,
34    pub name: String,
35    pub status: TaskStatus,
36    pub assignee: Option<String>,
37    pub data: serde_json::Value,
38    pub created_at: chrono::DateTime<chrono::Utc>,
39    pub updated_at: chrono::DateTime<chrono::Utc>,
40    pub completed_at: Option<chrono::DateTime<chrono::Utc>>,
41}
42
43/// Task status enumeration
44#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
45pub enum TaskStatus {
46    Pending,
47    Assigned,
48    InProgress,
49    Completed,
50    Failed,
51    Cancelled,
52}
53
54/// Workflow definition trait
55#[async_trait]
56pub trait WorkflowDefinition: Send + Sync {
57    fn name(&self) -> &str;
58    async fn start(&self, data: serde_json::Value) -> WorkflowResult<WorkflowState>;
59    async fn execute_task(
60        &self,
61        task_id: &str,
62        data: serde_json::Value,
63    ) -> WorkflowResult<TaskState>;
64    async fn get_tasks(&self, workflow_id: &str) -> WorkflowResult<Vec<TaskState>>;
65}
66
67/// Workflow engine trait
68#[async_trait]
69pub trait WorkflowEngine: Send + Sync {
70    async fn create_workflow(
71        &self,
72        definition_name: &str,
73        data: serde_json::Value,
74    ) -> WorkflowResult<WorkflowState>;
75    async fn get_workflow(&self, workflow_id: &str) -> WorkflowResult<WorkflowState>;
76    async fn update_workflow(
77        &self,
78        workflow_id: &str,
79        data: serde_json::Value,
80    ) -> WorkflowResult<WorkflowState>;
81    async fn complete_task(
82        &self,
83        task_id: &str,
84        data: serde_json::Value,
85    ) -> WorkflowResult<TaskState>;
86    async fn get_tasks(&self, workflow_id: &str) -> WorkflowResult<Vec<TaskState>>;
87}