use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use serde_json;
use std::sync::Arc;
use crate::core::{TaskState, WorkflowEngine, WorkflowResult, WorkflowState};
#[derive(Debug, Deserialize)]
pub struct CreateWorkflowRequest {
pub workflow_type: String,
pub data: serde_json::Value,
}
#[derive(Debug, Deserialize)]
pub struct CompleteTaskRequest {
pub data: serde_json::Value,
}
#[derive(Debug, Serialize)]
pub struct ApiResponse<T> {
pub success: bool,
pub data: Option<T>,
pub error: Option<String>,
}
impl<T> ApiResponse<T> {
pub fn success(data: T) -> Self {
Self {
success: true,
data: Some(data),
error: None,
}
}
pub fn error(message: String) -> Self {
Self {
success: false,
data: None,
error: Some(message),
}
}
}
#[async_trait]
pub trait WorkflowApi: Send + Sync {
async fn create_workflow(&self, req: CreateWorkflowRequest) -> WorkflowResult<WorkflowState>;
async fn get_workflow(&self, workflow_id: &str) -> WorkflowResult<WorkflowState>;
async fn get_tasks(&self, workflow_id: &str) -> WorkflowResult<Vec<TaskState>>;
async fn complete_task(
&self,
task_id: &str,
req: CompleteTaskRequest,
) -> WorkflowResult<TaskState>;
}
pub struct DefaultWorkflowApi {
engine: Arc<dyn WorkflowEngine>,
}
impl DefaultWorkflowApi {
pub fn new(engine: Arc<dyn WorkflowEngine>) -> Self {
Self { engine }
}
}
#[async_trait]
impl WorkflowApi for DefaultWorkflowApi {
async fn create_workflow(&self, req: CreateWorkflowRequest) -> WorkflowResult<WorkflowState> {
self.engine
.create_workflow(&req.workflow_type, req.data)
.await
}
async fn get_workflow(&self, workflow_id: &str) -> WorkflowResult<WorkflowState> {
self.engine.get_workflow(workflow_id).await
}
async fn get_tasks(&self, workflow_id: &str) -> WorkflowResult<Vec<TaskState>> {
self.engine.get_tasks(workflow_id).await
}
async fn complete_task(
&self,
task_id: &str,
req: CompleteTaskRequest,
) -> WorkflowResult<TaskState> {
self.engine.complete_task(task_id, req.data).await
}
}
#[cfg(feature = "axum")]
pub mod axum;
#[cfg(feature = "actix")]
pub mod actix;