pub mod constants;
pub mod custom_task;
pub mod do_task;
pub mod emit_task;
pub mod flow_directive;
pub mod for_task;
pub mod fork_task;
pub mod listen_task;
pub mod raise_task;
pub mod run_task;
pub mod set_task;
pub mod switch_task;
pub mod try_task;
pub mod wait_task;
#[cfg(test)]
mod tests;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
use super::input::InputDataModelDefinition;
use super::map::Map;
use super::output::OutputDataModelDefinition;
use super::timeout::OneOfTimeoutDefinitionOrReference;
pub use crate::models::call::CallTaskDefinition;
pub use constants::{
ContainerCleanupPolicy, EventReadMode, ExtensionTarget, FlowDirective, HttpMethod,
HttpOutputFormat, OAuth2GrantType, ProcessReturnType, ProcessType, PullPolicy, ScriptLanguage,
TaskType,
};
pub use custom_task::CustomTaskDefinition;
pub use do_task::DoTaskDefinition;
pub use emit_task::{EmitTaskDefinition, EventEmissionDefinition};
pub use flow_directive::{FlowDirectiveType, FlowDirectiveValue};
pub use for_task::{ForLoopDefinition, ForTaskDefinition};
pub use fork_task::{BranchingDefinition, ForkTaskDefinition};
pub use listen_task::{ListenTaskDefinition, ListenerDefinition, SubscriptionIteratorDefinition};
pub use raise_task::{RaiseErrorDefinition, RaiseTaskDefinition};
pub use run_task::{
ContainerLifetimeDefinition, ContainerProcessDefinition, OneOfRunArguments,
ProcessTypeDefinition, RunTaskDefinition, ScriptProcessDefinition, ShellProcessDefinition,
WorkflowProcessDefinition,
};
pub use set_task::{SetTaskDefinition, SetValue};
pub use switch_task::{SwitchCaseDefinition, SwitchTaskDefinition};
pub use try_task::{
ErrorCatcherDefinition, ErrorFilterDefinition, ErrorFilterProperties, TryTaskDefinition,
};
pub use wait_task::WaitTaskDefinition;
#[derive(Debug, Clone, PartialEq, Serialize)]
#[serde(untagged)]
pub enum TaskDefinition {
Call(Box<CallTaskDefinition>),
Do(DoTaskDefinition),
Emit(EmitTaskDefinition),
For(ForTaskDefinition),
Fork(ForkTaskDefinition),
Listen(Box<ListenTaskDefinition>),
Raise(RaiseTaskDefinition),
Run(Box<RunTaskDefinition>),
Set(SetTaskDefinition),
Switch(SwitchTaskDefinition),
Try(TryTaskDefinition),
Wait(WaitTaskDefinition),
Custom(CustomTaskDefinition),
}
impl TaskDefinition {
pub fn common_fields(&self) -> &TaskDefinitionFields {
match self {
TaskDefinition::Do(t) => &t.common,
TaskDefinition::Set(t) => &t.common,
TaskDefinition::Wait(t) => &t.common,
TaskDefinition::Raise(t) => &t.common,
TaskDefinition::For(t) => &t.common,
TaskDefinition::Switch(t) => &t.common,
TaskDefinition::Fork(t) => &t.common,
TaskDefinition::Try(t) => &t.common,
TaskDefinition::Emit(t) => &t.common,
TaskDefinition::Listen(t) => &t.common,
TaskDefinition::Call(call_def) => call_def.common_fields(),
TaskDefinition::Run(t) => &t.common,
TaskDefinition::Custom(t) => &t.common,
}
}
}
impl<'de> serde::Deserialize<'de> for TaskDefinition {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let value = Value::deserialize(deserializer)?;
macro_rules! try_deserialize {
($key:expr, $variant:ident, $ty:ty) => {
if value.get($key).is_some() {
return <$ty>::deserialize(value)
.map(TaskDefinition::$variant)
.map_err(serde::de::Error::custom);
}
};
}
macro_rules! try_deserialize_boxed {
($key:expr, $variant:ident, $ty:ty) => {
if value.get($key).is_some() {
return <$ty>::deserialize(value)
.map(|v| TaskDefinition::$variant(Box::new(v)))
.map_err(serde::de::Error::custom);
}
};
}
try_deserialize!("for", For, ForTaskDefinition);
try_deserialize_boxed!("call", Call, CallTaskDefinition);
try_deserialize!("set", Set, SetTaskDefinition);
try_deserialize!("fork", Fork, ForkTaskDefinition);
try_deserialize_boxed!("run", Run, RunTaskDefinition);
try_deserialize!("switch", Switch, SwitchTaskDefinition);
try_deserialize!("try", Try, TryTaskDefinition);
try_deserialize!("emit", Emit, EmitTaskDefinition);
try_deserialize!("raise", Raise, RaiseTaskDefinition);
try_deserialize!("wait", Wait, WaitTaskDefinition);
try_deserialize_boxed!("listen", Listen, ListenTaskDefinition);
try_deserialize!("do", Do, DoTaskDefinition);
CustomTaskDefinition::deserialize(value)
.map(TaskDefinition::Custom)
.map_err(serde::de::Error::custom)
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TaskDefinitionFields {
#[serde(rename = "if", skip_serializing_if = "Option::is_none")]
pub if_: Option<String>,
#[serde(rename = "input", skip_serializing_if = "Option::is_none")]
pub input: Option<InputDataModelDefinition>,
#[serde(rename = "output", skip_serializing_if = "Option::is_none")]
pub output: Option<OutputDataModelDefinition>,
#[serde(rename = "export", skip_serializing_if = "Option::is_none")]
pub export: Option<OutputDataModelDefinition>,
#[serde(rename = "timeout", skip_serializing_if = "Option::is_none")]
pub timeout: Option<OneOfTimeoutDefinitionOrReference>,
#[serde(rename = "then", skip_serializing_if = "Option::is_none")]
pub then: Option<String>,
#[serde(rename = "metadata", skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, Value>>,
}
impl Default for TaskDefinitionFields {
fn default() -> Self {
TaskDefinitionFields::new()
}
}
impl TaskDefinitionFields {
pub fn new() -> Self {
Self {
if_: None,
input: None,
output: None,
export: None,
timeout: None,
then: None,
metadata: None,
}
}
}