ironflow_engine/config/
workflow.rs1use ironflow_core::retry::RetryPolicy;
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct WorkflowStepConfig {
23 pub workflow_name: String,
25 pub payload: Value,
27 #[serde(default, skip_serializing_if = "Option::is_none")]
29 pub retry: Option<RetryPolicy>,
30}
31
32impl WorkflowStepConfig {
33 pub fn new(workflow_name: &str, payload: Value) -> Self {
45 Self {
46 workflow_name: workflow_name.to_string(),
47 payload,
48 retry: None,
49 }
50 }
51
52 pub fn retry_policy(mut self, policy: RetryPolicy) -> Self {
66 self.retry = Some(policy);
67 self
68 }
69}
70
71#[cfg(test)]
72mod tests {
73 use super::*;
74 use serde_json::json;
75
76 #[test]
77 fn new_sets_fields() {
78 let config = WorkflowStepConfig::new("build", json!({"key": "val"}));
79 assert_eq!(config.workflow_name, "build");
80 assert_eq!(config.payload["key"], "val");
81 }
82
83 #[test]
84 fn serde_roundtrip() {
85 let config = WorkflowStepConfig::new("deploy", json!({"env": "prod"}));
86 let json = serde_json::to_string(&config).unwrap();
87 let back: WorkflowStepConfig = serde_json::from_str(&json).unwrap();
88 assert_eq!(back.workflow_name, "deploy");
89 assert_eq!(back.payload["env"], "prod");
90 }
91
92 #[test]
93 fn a_config_predating_retry_still_deserializes() {
94 let config: WorkflowStepConfig =
95 serde_json::from_str(r#"{"workflow_name":"build","payload":{"key":"val"}}"#)
96 .expect("deserialize");
97 assert!(config.retry.is_none());
98 }
99
100 #[test]
101 fn retry_policy_roundtrip() {
102 let config = WorkflowStepConfig::new("deploy", json!({})).retry_policy(RetryPolicy::new(3));
103 let json = serde_json::to_string(&config).expect("serialize");
104 let back: WorkflowStepConfig = serde_json::from_str(&json).expect("deserialize");
105 assert_eq!(back.retry.as_ref().unwrap().max_retries(), 3);
106 }
107}