1pub mod constants;
2pub mod custom_task;
3pub mod do_task;
4pub mod emit_task;
5pub mod flow_directive;
6pub mod for_task;
7pub mod fork_task;
8pub mod listen_task;
9pub mod raise_task;
10pub mod run_task;
11pub mod set_task;
12pub mod switch_task;
13pub mod try_task;
14pub mod wait_task;
15
16#[cfg(test)]
17mod tests;
18
19use serde::{Deserialize, Serialize};
20use serde_json::Value;
21use std::collections::HashMap;
22
23use super::input::InputDataModelDefinition;
24use super::map::Map;
25use super::output::OutputDataModelDefinition;
26use super::timeout::OneOfTimeoutDefinitionOrReference;
27
28pub use crate::models::call::CallTaskDefinition;
30
31pub use constants::{
33 ContainerCleanupPolicy, EventReadMode, ExtensionTarget, FlowDirective, HttpMethod,
34 HttpOutputFormat, OAuth2GrantType, ProcessReturnType, ProcessType, PullPolicy, ScriptLanguage,
35 TaskType,
36};
37pub use custom_task::CustomTaskDefinition;
38pub use do_task::DoTaskDefinition;
39pub use emit_task::{EmitTaskDefinition, EventEmissionDefinition};
40pub use flow_directive::{FlowDirectiveType, FlowDirectiveValue};
41pub use for_task::{ForLoopDefinition, ForTaskDefinition};
42pub use fork_task::{BranchingDefinition, ForkTaskDefinition};
43pub use listen_task::{ListenTaskDefinition, ListenerDefinition, SubscriptionIteratorDefinition};
44pub use raise_task::{RaiseErrorDefinition, RaiseTaskDefinition};
45pub use run_task::{
46 ContainerLifetimeDefinition, ContainerProcessDefinition, OneOfRunArguments,
47 ProcessTypeDefinition, RunTaskDefinition, ScriptProcessDefinition, ShellProcessDefinition,
48 WorkflowProcessDefinition,
49};
50pub use set_task::{SetTaskDefinition, SetValue};
51pub use switch_task::{SwitchCaseDefinition, SwitchTaskDefinition};
52pub use try_task::{
53 ErrorCatcherDefinition, ErrorFilterDefinition, ErrorFilterProperties, TryTaskDefinition,
54};
55pub use wait_task::WaitTaskDefinition;
56
57#[derive(Debug, Clone, PartialEq, Serialize)]
59#[serde(untagged)]
60pub enum TaskDefinition {
61 Call(Box<CallTaskDefinition>),
63 Do(DoTaskDefinition),
65 Emit(EmitTaskDefinition),
67 For(ForTaskDefinition),
69 Fork(ForkTaskDefinition),
71 Listen(Box<ListenTaskDefinition>),
73 Raise(RaiseTaskDefinition),
75 Run(Box<RunTaskDefinition>),
77 Set(SetTaskDefinition),
79 Switch(SwitchTaskDefinition),
81 Try(TryTaskDefinition),
83 Wait(WaitTaskDefinition),
85 Custom(CustomTaskDefinition),
87}
88
89impl TaskDefinition {
90 pub fn common_fields(&self) -> &TaskDefinitionFields {
93 match self {
94 TaskDefinition::Do(t) => &t.common,
95 TaskDefinition::Set(t) => &t.common,
96 TaskDefinition::Wait(t) => &t.common,
97 TaskDefinition::Raise(t) => &t.common,
98 TaskDefinition::For(t) => &t.common,
99 TaskDefinition::Switch(t) => &t.common,
100 TaskDefinition::Fork(t) => &t.common,
101 TaskDefinition::Try(t) => &t.common,
102 TaskDefinition::Emit(t) => &t.common,
103 TaskDefinition::Listen(t) => &t.common,
104 TaskDefinition::Call(call_def) => call_def.common_fields(),
105 TaskDefinition::Run(t) => &t.common,
106 TaskDefinition::Custom(t) => &t.common,
107 }
108 }
109}
110
111impl<'de> serde::Deserialize<'de> for TaskDefinition {
119 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
120 where
121 D: serde::Deserializer<'de>,
122 {
123 let value = Value::deserialize(deserializer)?;
124
125 macro_rules! try_deserialize {
126 ($key:expr, $variant:ident, $ty:ty) => {
127 if value.get($key).is_some() {
128 return <$ty>::deserialize(value)
129 .map(TaskDefinition::$variant)
130 .map_err(serde::de::Error::custom);
131 }
132 };
133 }
134 macro_rules! try_deserialize_boxed {
135 ($key:expr, $variant:ident, $ty:ty) => {
136 if value.get($key).is_some() {
137 return <$ty>::deserialize(value)
138 .map(|v| TaskDefinition::$variant(Box::new(v)))
139 .map_err(serde::de::Error::custom);
140 }
141 };
142 }
143
144 try_deserialize!("for", For, ForTaskDefinition);
146 try_deserialize_boxed!("call", Call, CallTaskDefinition);
148 try_deserialize!("set", Set, SetTaskDefinition);
149 try_deserialize!("fork", Fork, ForkTaskDefinition);
150 try_deserialize_boxed!("run", Run, RunTaskDefinition);
151 try_deserialize!("switch", Switch, SwitchTaskDefinition);
152 try_deserialize!("try", Try, TryTaskDefinition);
153 try_deserialize!("emit", Emit, EmitTaskDefinition);
154 try_deserialize!("raise", Raise, RaiseTaskDefinition);
155 try_deserialize!("wait", Wait, WaitTaskDefinition);
156 try_deserialize_boxed!("listen", Listen, ListenTaskDefinition);
157 try_deserialize!("do", Do, DoTaskDefinition);
159
160 CustomTaskDefinition::deserialize(value)
163 .map(TaskDefinition::Custom)
164 .map_err(serde::de::Error::custom)
165 }
166}
167
168#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
170pub struct TaskDefinitionFields {
171 #[serde(rename = "if", skip_serializing_if = "Option::is_none")]
173 pub if_: Option<String>,
174
175 #[serde(rename = "input", skip_serializing_if = "Option::is_none")]
177 pub input: Option<InputDataModelDefinition>,
178
179 #[serde(rename = "output", skip_serializing_if = "Option::is_none")]
181 pub output: Option<OutputDataModelDefinition>,
182
183 #[serde(rename = "export", skip_serializing_if = "Option::is_none")]
185 pub export: Option<OutputDataModelDefinition>,
186
187 #[serde(rename = "timeout", skip_serializing_if = "Option::is_none")]
189 pub timeout: Option<OneOfTimeoutDefinitionOrReference>,
190
191 #[serde(rename = "then", skip_serializing_if = "Option::is_none")]
193 pub then: Option<String>,
194
195 #[serde(rename = "metadata", skip_serializing_if = "Option::is_none")]
197 pub metadata: Option<HashMap<String, Value>>,
198}
199impl Default for TaskDefinitionFields {
200 fn default() -> Self {
201 TaskDefinitionFields::new()
202 }
203}
204impl TaskDefinitionFields {
205 pub fn new() -> Self {
207 Self {
208 if_: None,
209 input: None,
210 output: None,
211 export: None,
212 timeout: None,
213 then: None,
214 metadata: None,
215 }
216 }
217}