Skip to main content

rust_viewflow/api/
mod.rs

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/// API request for creating a workflow
9#[derive(Debug, Deserialize)]
10pub struct CreateWorkflowRequest {
11    pub workflow_type: String,
12    pub data: serde_json::Value,
13}
14
15/// API request for completing a task
16#[derive(Debug, Deserialize)]
17pub struct CompleteTaskRequest {
18    pub data: serde_json::Value,
19}
20
21/// API response
22#[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/// Workflow API trait
48#[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
60/// Default API implementation
61pub 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;