use crate::model::ProcessDefinition;
use std::collections::HashMap;
#[derive(Debug, Clone)]
pub struct ExecutionContext {
pub process_definition: ProcessDefinition,
pub instance_id: String,
pub current_elements: Vec<String>,
pub variables: HashMap<String, serde_json::Value>,
pub execution_history: Vec<ExecutionStep>,
pub state: ProcessInstanceState,
}
impl ExecutionContext {
pub fn new(process_definition: ProcessDefinition, instance_id: String) -> Self {
Self {
process_definition,
instance_id,
current_elements: Vec::new(),
variables: HashMap::new(),
execution_history: Vec::new(),
state: ProcessInstanceState::Active,
}
}
pub fn set_variable(&mut self, name: String, value: serde_json::Value) {
self.variables.insert(name, value);
}
pub fn get_variable(&self, name: &str) -> Option<&serde_json::Value> {
self.variables.get(name)
}
pub fn add_execution_step(&mut self, step: ExecutionStep) {
self.execution_history.push(step);
}
pub fn set_current_elements(&mut self, element_ids: Vec<String>) {
self.current_elements = element_ids;
}
pub fn clear_current_elements(&mut self) {
self.current_elements.clear();
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ProcessInstanceState {
Active,
Completed,
Terminated,
Suspended,
Failed,
}
#[derive(Debug, Clone)]
pub struct ExecutionStep {
pub element_id: String,
pub timestamp: std::time::SystemTime,
pub result: ExecutionStepResult,
}
#[derive(Debug, Clone)]
pub enum ExecutionStepResult {
Completed,
Failed(String),
Waiting(String),
}