1use async_trait::async_trait;
2use serde::{Deserialize, Serialize};
3use serde_json;
4use std::sync::Arc;
5
6use crate::core::{TaskState, WorkflowEngine, WorkflowResult, WorkflowState};
7
8#[derive(Debug, Deserialize)]
10pub struct CreateWorkflowRequest {
11 pub workflow_type: String,
12 pub data: serde_json::Value,
13}
14
15#[derive(Debug, Deserialize)]
17pub struct CompleteTaskRequest {
18 pub data: serde_json::Value,
19}
20
21#[derive(Debug, Serialize)]
23pub struct ApiResponse<T> {
24 pub success: bool,
25 pub data: Option<T>,
26 pub error: Option<String>,
27}
28
29impl<T> ApiResponse<T> {
30 pub fn success(data: T) -> Self {
31 Self {
32 success: true,
33 data: Some(data),
34 error: None,
35 }
36 }
37
38 pub fn error(message: String) -> Self {
39 Self {
40 success: false,
41 data: None,
42 error: Some(message),
43 }
44 }
45}
46
47#[async_trait]
49pub trait WorkflowApi: Send + Sync {
50 async fn create_workflow(&self, req: CreateWorkflowRequest) -> WorkflowResult<WorkflowState>;
51 async fn get_workflow(&self, workflow_id: &str) -> WorkflowResult<WorkflowState>;
52 async fn get_tasks(&self, workflow_id: &str) -> WorkflowResult<Vec<TaskState>>;
53 async fn complete_task(
54 &self,
55 task_id: &str,
56 req: CompleteTaskRequest,
57 ) -> WorkflowResult<TaskState>;
58}
59
60pub struct DefaultWorkflowApi {
62 engine: Arc<dyn WorkflowEngine>,
63}
64
65impl DefaultWorkflowApi {
66 pub fn new(engine: Arc<dyn WorkflowEngine>) -> Self {
67 Self { engine }
68 }
69}
70
71#[async_trait]
72impl WorkflowApi for DefaultWorkflowApi {
73 async fn create_workflow(&self, req: CreateWorkflowRequest) -> WorkflowResult<WorkflowState> {
74 self.engine
75 .create_workflow(&req.workflow_type, req.data)
76 .await
77 }
78
79 async fn get_workflow(&self, workflow_id: &str) -> WorkflowResult<WorkflowState> {
80 self.engine.get_workflow(workflow_id).await
81 }
82
83 async fn get_tasks(&self, workflow_id: &str) -> WorkflowResult<Vec<TaskState>> {
84 self.engine.get_tasks(workflow_id).await
85 }
86
87 async fn complete_task(
88 &self,
89 task_id: &str,
90 req: CompleteTaskRequest,
91 ) -> WorkflowResult<TaskState> {
92 self.engine.complete_task(task_id, req.data).await
93 }
94}
95
96#[cfg(feature = "axum")]
97pub mod axum;
98
99#[cfg(feature = "actix")]
100pub mod actix;