use async_trait::async_trait;
use serde::de::DeserializeOwned;
use serde::Serialize;
use crate::models::{ExecutionPointer, ExecutionResult, WorkflowInstance, WorkflowStep};
pub trait WorkflowData: Serialize + DeserializeOwned + Send + Sync + Clone + 'static {}
impl<T> WorkflowData for T where T: Serialize + DeserializeOwned + Send + Sync + Clone + 'static {}
#[derive(Debug)]
pub struct StepExecutionContext<'a> {
pub item: Option<&'a serde_json::Value>,
pub execution_pointer: &'a ExecutionPointer,
pub persistence_data: Option<&'a serde_json::Value>,
pub step: &'a WorkflowStep,
pub workflow: &'a WorkflowInstance,
pub cancellation_token: tokio_util::sync::CancellationToken,
}
#[async_trait]
pub trait StepBody: Send + Sync {
async fn run(&mut self, context: &StepExecutionContext<'_>) -> crate::Result<ExecutionResult>;
}