use crate::engine::ExecutionContext;
use crate::model::ProcessElement;
use async_trait::async_trait;
use std::sync::Arc;
#[async_trait]
pub trait Activity: Send + Sync {
async fn execute(&self, context: &mut ExecutionContext) -> Result<ActivityResult, ActivityError>;
fn id(&self) -> &str;
fn name(&self) -> Option<&str>;
}
#[derive(Debug, Clone)]
pub enum ActivityResult {
Completed {
output_variables: Option<std::collections::HashMap<String, serde_json::Value>>,
},
Waiting {
reason: String,
},
Continue {
next_elements: Vec<String>,
},
}
#[derive(Debug, Clone, thiserror::Error)]
pub enum ActivityError {
#[error("Activity execution failed: {0}")]
ExecutionFailed(String),
#[error("Invalid input: {0}")]
InvalidInput(String),
#[error("Activity not found: {0}")]
NotFound(String),
#[error("Condition evaluation failed: {0}")]
ConditionEvaluationFailed(String),
}
pub trait ActivityFactory: Send + Sync + std::fmt::Debug {
fn create_activity(&self, element: &ProcessElement) -> Result<Arc<dyn Activity>, ActivityError>;
}