1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3use std::collections::HashMap;
4
5use super::TaskDefinitionFields;
6use crate::models::resource::ExternalResourceDefinition;
7
8#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
10pub struct RunTaskDefinition {
11 #[serde(rename = "run")]
13 pub run: ProcessTypeDefinition,
14
15 #[serde(flatten)]
17 pub common: TaskDefinitionFields,
18}
19impl RunTaskDefinition {
20 pub fn new(run: ProcessTypeDefinition) -> Self {
22 Self {
23 run,
24 common: TaskDefinitionFields::new(),
25 }
26 }
27}
28
29#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
31pub struct ProcessTypeDefinition {
32 #[serde(rename = "container", skip_serializing_if = "Option::is_none")]
34 pub container: Option<ContainerProcessDefinition>,
35
36 #[serde(rename = "script", skip_serializing_if = "Option::is_none")]
38 pub script: Option<ScriptProcessDefinition>,
39
40 #[serde(rename = "shell", skip_serializing_if = "Option::is_none")]
42 pub shell: Option<ShellProcessDefinition>,
43
44 #[serde(rename = "workflow", skip_serializing_if = "Option::is_none")]
46 pub workflow: Option<WorkflowProcessDefinition>,
47
48 #[serde(rename = "await", skip_serializing_if = "Option::is_none")]
50 pub await_: Option<bool>,
51
52 #[serde(rename = "return", skip_serializing_if = "Option::is_none")]
55 pub return_: Option<String>,
56}
57impl ProcessTypeDefinition {
58 pub fn using_container(container: ContainerProcessDefinition, await_: Option<bool>) -> Self {
60 Self {
61 container: Some(container),
62 await_,
63 ..Self::default()
64 }
65 }
66
67 pub fn using_script(script: ScriptProcessDefinition, await_: Option<bool>) -> Self {
69 Self {
70 script: Some(script),
71 await_,
72 ..Self::default()
73 }
74 }
75
76 pub fn using_shell(shell: ShellProcessDefinition, await_: Option<bool>) -> Self {
78 Self {
79 shell: Some(shell),
80 await_,
81 ..Self::default()
82 }
83 }
84
85 pub fn using_workflow(workflow: WorkflowProcessDefinition, await_: Option<bool>) -> Self {
87 Self {
88 workflow: Some(workflow),
89 await_,
90 ..Self::default()
91 }
92 }
93
94 pub fn get_process_type(&self) -> Option<&str> {
96 if self.container.is_some() {
97 Some(super::constants::ProcessType::CONTAINER)
98 } else if self.script.is_some() {
99 Some(super::constants::ProcessType::SCRIPT)
100 } else if self.shell.is_some() {
101 Some(super::constants::ProcessType::SHELL)
102 } else if self.workflow.is_some() {
103 Some(super::constants::ProcessType::WORKFLOW)
104 } else {
105 None
106 }
107 }
108}
109
110#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
112pub struct ContainerLifetimeDefinition {
113 #[serde(rename = "cleanup")]
115 pub cleanup: String,
116
117 #[serde(rename = "after", skip_serializing_if = "Option::is_none")]
119 pub after: Option<crate::models::duration::OneOfDurationOrIso8601Expression>,
120}
121
122#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
124pub struct ContainerProcessDefinition {
125 #[serde(rename = "image")]
127 pub image: String,
128
129 #[serde(rename = "name", skip_serializing_if = "Option::is_none")]
131 pub name: Option<String>,
132
133 #[serde(rename = "command", skip_serializing_if = "Option::is_none")]
135 pub command: Option<String>,
136
137 #[serde(rename = "ports", skip_serializing_if = "Option::is_none")]
140 pub ports: Option<HashMap<String, Value>>,
141
142 #[serde(rename = "volumes", skip_serializing_if = "Option::is_none")]
145 pub volumes: Option<HashMap<String, Value>>,
146
147 #[serde(rename = "environment", skip_serializing_if = "Option::is_none")]
149 pub environment: Option<HashMap<String, String>>,
150
151 #[serde(rename = "stdin", skip_serializing_if = "Option::is_none")]
153 pub stdin: Option<String>,
154
155 #[serde(rename = "arguments", skip_serializing_if = "Option::is_none")]
157 pub arguments: Option<Vec<String>>,
158
159 #[serde(rename = "pullPolicy", skip_serializing_if = "Option::is_none")]
161 pub pull_policy: Option<String>,
162
163 #[serde(rename = "lifetime", skip_serializing_if = "Option::is_none")]
165 pub lifetime: Option<ContainerLifetimeDefinition>,
166}
167
168#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
171#[serde(untagged)]
172pub enum OneOfRunArguments {
173 Array(Vec<String>),
175 Map(HashMap<String, Value>),
177}
178
179impl Default for OneOfRunArguments {
180 fn default() -> Self {
181 OneOfRunArguments::Array(Vec::new())
182 }
183}
184
185impl OneOfRunArguments {
186 pub fn as_array(&self) -> Option<&[String]> {
188 match self {
189 OneOfRunArguments::Array(arr) => Some(arr),
190 _ => None,
191 }
192 }
193
194 pub fn as_map(&self) -> Option<&HashMap<String, Value>> {
196 match self {
197 OneOfRunArguments::Map(map) => Some(map),
198 _ => None,
199 }
200 }
201
202 pub fn is_array(&self) -> bool {
204 matches!(self, OneOfRunArguments::Array(_))
205 }
206
207 pub fn is_map(&self) -> bool {
209 matches!(self, OneOfRunArguments::Map(_))
210 }
211}
212
213#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
215pub struct ScriptProcessDefinition {
216 #[serde(rename = "language")]
218 pub language: String,
219
220 #[serde(rename = "code", skip_serializing_if = "Option::is_none")]
222 pub code: Option<String>,
223
224 #[serde(rename = "source", skip_serializing_if = "Option::is_none")]
226 pub source: Option<ExternalResourceDefinition>,
227
228 #[serde(rename = "stdin", skip_serializing_if = "Option::is_none")]
230 pub stdin: Option<String>,
231
232 #[serde(rename = "arguments", skip_serializing_if = "Option::is_none")]
234 pub arguments: Option<OneOfRunArguments>,
235
236 #[serde(rename = "environment", skip_serializing_if = "Option::is_none")]
238 pub environment: Option<HashMap<String, String>>,
239}
240impl ScriptProcessDefinition {
241 pub fn from_code(
243 language: &str,
244 code: String,
245 stdin: Option<String>,
246 arguments: Option<OneOfRunArguments>,
247 environment: Option<HashMap<String, String>>,
248 ) -> Self {
249 Self {
250 language: language.to_string(),
251 code: Some(code),
252 source: None,
253 stdin,
254 arguments,
255 environment,
256 }
257 }
258
259 pub fn from_source(
261 language: &str,
262 source: ExternalResourceDefinition,
263 stdin: Option<String>,
264 arguments: Option<OneOfRunArguments>,
265 environment: Option<HashMap<String, String>>,
266 ) -> Self {
267 Self {
268 language: language.to_string(),
269 code: None,
270 source: Some(source),
271 stdin,
272 arguments,
273 environment,
274 }
275 }
276}
277
278#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
280pub struct ShellProcessDefinition {
281 #[serde(rename = "command")]
283 pub command: String,
284
285 #[serde(rename = "arguments", skip_serializing_if = "Option::is_none")]
287 pub arguments: Option<OneOfRunArguments>,
288
289 #[serde(rename = "environment", skip_serializing_if = "Option::is_none")]
291 pub environment: Option<HashMap<String, String>>,
292}
293impl ShellProcessDefinition {
294 pub fn new(
295 command: &str,
296 arguments: Option<OneOfRunArguments>,
297 environment: Option<HashMap<String, String>>,
298 ) -> Self {
299 Self {
300 command: command.to_string(),
301 arguments,
302 environment,
303 }
304 }
305}
306
307#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
309pub struct WorkflowProcessDefinition {
310 #[serde(rename = "namespace")]
312 pub namespace: String,
313
314 #[serde(rename = "name")]
316 pub name: String,
317
318 #[serde(rename = "version")]
320 pub version: String,
321
322 #[serde(rename = "input", skip_serializing_if = "Option::is_none")]
324 pub input: Option<Value>,
325}
326impl WorkflowProcessDefinition {
327 pub fn new(namespace: &str, name: &str, version: &str, input: Option<Value>) -> Self {
328 Self {
329 namespace: namespace.to_string(),
330 name: name.to_string(),
331 version: version.to_string(),
332 input,
333 }
334 }
335}