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>>;
#[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>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum WorkflowStatus {
Pending,
Running,
Completed,
Failed,
Cancelled,
}
#[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>>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum TaskStatus {
Pending,
Assigned,
InProgress,
Completed,
Failed,
Cancelled,
}
#[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>>;
}
#[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>>;
}