1use async_trait::async_trait;
2use serde::de::DeserializeOwned;
3use serde::Serialize;
4
5use crate::models::{ExecutionPointer, ExecutionResult, WorkflowInstance, WorkflowStep};
6
7pub trait WorkflowData: Serialize + DeserializeOwned + Send + Sync + Clone + 'static {}
10
11impl<T> WorkflowData for T where T: Serialize + DeserializeOwned + Send + Sync + Clone + 'static {}
13
14#[derive(Debug)]
16pub struct StepExecutionContext<'a> {
17 pub item: Option<&'a serde_json::Value>,
19 pub execution_pointer: &'a ExecutionPointer,
21 pub persistence_data: Option<&'a serde_json::Value>,
23 pub step: &'a WorkflowStep,
25 pub workflow: &'a WorkflowInstance,
27 pub cancellation_token: tokio_util::sync::CancellationToken,
29}
30
31#[async_trait]
33pub trait StepBody: Send + Sync {
34 async fn run(&mut self, context: &StepExecutionContext<'_>) -> crate::Result<ExecutionResult>;
35}