use serde::{Deserialize, Serialize};
use crate::types::WorkflowStatus;
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum WorkflowCommand {
ScheduleActivity {
name: String,
input: Option<String>,
task_queue: Option<String>,
#[serde(default = "default_max_attempts")]
max_attempts: i32,
#[serde(default = "default_initial_interval")]
initial_interval_secs: f64,
#[serde(default = "default_backoff")]
backoff_coefficient: f64,
#[serde(default = "default_start_to_close")]
start_to_close_secs: f64,
heartbeat_timeout_secs: Option<f64>,
},
StartTimer {
duration_secs: f64,
},
CompleteWorkflow {
result: Option<String>,
},
FailWorkflow {
error: String,
},
StartChildWorkflow {
workflow_type: String,
workflow_id: String,
input: Option<String>,
task_queue: Option<String>,
},
ContinueAsNew {
input: Option<String>,
},
SideEffect {
value: String,
},
}
fn default_max_attempts() -> i32 {
3
}
fn default_initial_interval() -> f64 {
1.0
}
fn default_backoff() -> f64 {
2.0
}
fn default_start_to_close() -> f64 {
300.0
}
pub fn is_valid_transition(from: WorkflowStatus, to: WorkflowStatus) -> bool {
use WorkflowStatus::*;
matches!(
(from, to),
(Pending, Running)
| (Running, Waiting)
| (Running, Completed)
| (Running, Failed)
| (Waiting, Running)
| (Waiting, Completed)
| (Waiting, Failed)
| (Pending, Cancelled)
| (Running, Cancelled)
| (Waiting, Cancelled)
| (Running, TimedOut)
| (Waiting, TimedOut)
)
}
#[derive(Debug)]
pub enum TurnResult {
Continue(Vec<WorkflowCommand>),
Completed(Option<String>),
Failed(String),
}