rust_viewflow/core/
workflow.rs1use 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#[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#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
21pub enum WorkflowStatus {
22 Pending,
23 Running,
24 Completed,
25 Failed,
26 Cancelled,
27}
28
29#[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#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
45pub enum TaskStatus {
46 Pending,
47 Assigned,
48 InProgress,
49 Completed,
50 Failed,
51 Cancelled,
52}
53
54#[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#[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}