use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
use super::TaskDefinitionFields;
use crate::models::resource::ExternalResourceDefinition;
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
pub struct RunTaskDefinition {
#[serde(rename = "run")]
pub run: ProcessTypeDefinition,
#[serde(flatten)]
pub common: TaskDefinitionFields,
}
impl RunTaskDefinition {
pub fn new(run: ProcessTypeDefinition) -> Self {
Self {
run,
common: TaskDefinitionFields::new(),
}
}
}
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
pub struct ProcessTypeDefinition {
#[serde(rename = "container", skip_serializing_if = "Option::is_none")]
pub container: Option<ContainerProcessDefinition>,
#[serde(rename = "script", skip_serializing_if = "Option::is_none")]
pub script: Option<ScriptProcessDefinition>,
#[serde(rename = "shell", skip_serializing_if = "Option::is_none")]
pub shell: Option<ShellProcessDefinition>,
#[serde(rename = "workflow", skip_serializing_if = "Option::is_none")]
pub workflow: Option<WorkflowProcessDefinition>,
#[serde(rename = "await", skip_serializing_if = "Option::is_none")]
pub await_: Option<bool>,
#[serde(rename = "return", skip_serializing_if = "Option::is_none")]
pub return_: Option<String>,
}
impl ProcessTypeDefinition {
pub fn using_container(container: ContainerProcessDefinition, await_: Option<bool>) -> Self {
Self {
container: Some(container),
await_,
..Self::default()
}
}
pub fn using_script(script: ScriptProcessDefinition, await_: Option<bool>) -> Self {
Self {
script: Some(script),
await_,
..Self::default()
}
}
pub fn using_shell(shell: ShellProcessDefinition, await_: Option<bool>) -> Self {
Self {
shell: Some(shell),
await_,
..Self::default()
}
}
pub fn using_workflow(workflow: WorkflowProcessDefinition, await_: Option<bool>) -> Self {
Self {
workflow: Some(workflow),
await_,
..Self::default()
}
}
pub fn get_process_type(&self) -> Option<&str> {
if self.container.is_some() {
Some(super::constants::ProcessType::CONTAINER)
} else if self.script.is_some() {
Some(super::constants::ProcessType::SCRIPT)
} else if self.shell.is_some() {
Some(super::constants::ProcessType::SHELL)
} else if self.workflow.is_some() {
Some(super::constants::ProcessType::WORKFLOW)
} else {
None
}
}
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ContainerLifetimeDefinition {
#[serde(rename = "cleanup")]
pub cleanup: String,
#[serde(rename = "after", skip_serializing_if = "Option::is_none")]
pub after: Option<crate::models::duration::OneOfDurationOrIso8601Expression>,
}
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
pub struct ContainerProcessDefinition {
#[serde(rename = "image")]
pub image: String,
#[serde(rename = "name", skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(rename = "command", skip_serializing_if = "Option::is_none")]
pub command: Option<String>,
#[serde(rename = "ports", skip_serializing_if = "Option::is_none")]
pub ports: Option<HashMap<String, Value>>,
#[serde(rename = "volumes", skip_serializing_if = "Option::is_none")]
pub volumes: Option<HashMap<String, Value>>,
#[serde(rename = "environment", skip_serializing_if = "Option::is_none")]
pub environment: Option<HashMap<String, String>>,
#[serde(rename = "stdin", skip_serializing_if = "Option::is_none")]
pub stdin: Option<String>,
#[serde(rename = "arguments", skip_serializing_if = "Option::is_none")]
pub arguments: Option<Vec<String>>,
#[serde(rename = "pullPolicy", skip_serializing_if = "Option::is_none")]
pub pull_policy: Option<String>,
#[serde(rename = "lifetime", skip_serializing_if = "Option::is_none")]
pub lifetime: Option<ContainerLifetimeDefinition>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum OneOfRunArguments {
Array(Vec<String>),
Map(HashMap<String, Value>),
}
impl Default for OneOfRunArguments {
fn default() -> Self {
OneOfRunArguments::Array(Vec::new())
}
}
impl OneOfRunArguments {
pub fn as_array(&self) -> Option<&[String]> {
match self {
OneOfRunArguments::Array(arr) => Some(arr),
_ => None,
}
}
pub fn as_map(&self) -> Option<&HashMap<String, Value>> {
match self {
OneOfRunArguments::Map(map) => Some(map),
_ => None,
}
}
pub fn is_array(&self) -> bool {
matches!(self, OneOfRunArguments::Array(_))
}
pub fn is_map(&self) -> bool {
matches!(self, OneOfRunArguments::Map(_))
}
}
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
pub struct ScriptProcessDefinition {
#[serde(rename = "language")]
pub language: String,
#[serde(rename = "code", skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(rename = "source", skip_serializing_if = "Option::is_none")]
pub source: Option<ExternalResourceDefinition>,
#[serde(rename = "stdin", skip_serializing_if = "Option::is_none")]
pub stdin: Option<String>,
#[serde(rename = "arguments", skip_serializing_if = "Option::is_none")]
pub arguments: Option<OneOfRunArguments>,
#[serde(rename = "environment", skip_serializing_if = "Option::is_none")]
pub environment: Option<HashMap<String, String>>,
}
impl ScriptProcessDefinition {
pub fn from_code(
language: &str,
code: String,
stdin: Option<String>,
arguments: Option<OneOfRunArguments>,
environment: Option<HashMap<String, String>>,
) -> Self {
Self {
language: language.to_string(),
code: Some(code),
source: None,
stdin,
arguments,
environment,
}
}
pub fn from_source(
language: &str,
source: ExternalResourceDefinition,
stdin: Option<String>,
arguments: Option<OneOfRunArguments>,
environment: Option<HashMap<String, String>>,
) -> Self {
Self {
language: language.to_string(),
code: None,
source: Some(source),
stdin,
arguments,
environment,
}
}
}
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
pub struct ShellProcessDefinition {
#[serde(rename = "command")]
pub command: String,
#[serde(rename = "arguments", skip_serializing_if = "Option::is_none")]
pub arguments: Option<OneOfRunArguments>,
#[serde(rename = "environment", skip_serializing_if = "Option::is_none")]
pub environment: Option<HashMap<String, String>>,
}
impl ShellProcessDefinition {
pub fn new(
command: &str,
arguments: Option<OneOfRunArguments>,
environment: Option<HashMap<String, String>>,
) -> Self {
Self {
command: command.to_string(),
arguments,
environment,
}
}
}
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
pub struct WorkflowProcessDefinition {
#[serde(rename = "namespace")]
pub namespace: String,
#[serde(rename = "name")]
pub name: String,
#[serde(rename = "version")]
pub version: String,
#[serde(rename = "input", skip_serializing_if = "Option::is_none")]
pub input: Option<Value>,
}
impl WorkflowProcessDefinition {
pub fn new(namespace: &str, name: &str, version: &str, input: Option<Value>) -> Self {
Self {
namespace: namespace.to_string(),
name: name.to_string(),
version: version.to_string(),
input,
}
}
}