use crate::services::authentication::*;
use crate::services::timeout::*;
use serde_json::Value;
use serverless_workflow_core::models::duration::*;
use serverless_workflow_core::models::error::*;
use serverless_workflow_core::models::event::*;
use serverless_workflow_core::models::input::*;
use serverless_workflow_core::models::map::*;
use serverless_workflow_core::models::output::*;
use serverless_workflow_core::models::resource::*;
use serverless_workflow_core::models::retry::*;
use serverless_workflow_core::models::schema::*;
use serverless_workflow_core::models::task::*;
use serverless_workflow_core::models::timeout::*;
use std::collections::HashMap;
pub struct GenericTaskDefinitionBuilder{
builder: Option<TaskDefinitionBuilder>
}
impl GenericTaskDefinitionBuilder{
pub fn new() -> Self{
Self{
builder: None
}
}
pub fn call(&mut self, function: &str) -> &mut CalltaskDefinitionBuilder{
let builder = CalltaskDefinitionBuilder::new(function);
self.builder = Some(TaskDefinitionBuilder::Call(builder));
if let Some(TaskDefinitionBuilder::Call(ref mut builder)) = self.builder{
builder
}
else {
unreachable!("Builder should always be set to Call");
}
}
pub fn do_(&mut self) -> &mut DoTaskDefinitionBuilder{
let builder = DoTaskDefinitionBuilder::new();
self.builder = Some(TaskDefinitionBuilder::Do(builder));
if let Some(TaskDefinitionBuilder::Do(ref mut builder)) = self.builder{
builder
}
else {
unreachable!("Builder should always be set to Do");
}
}
pub fn emit<F>(&mut self, setup: F) -> &mut EmitTaskDefinitionBuilder
where F: FnOnce(&mut EventDefinitionBuilder){
let mut event_builder: EventDefinitionBuilder = EventDefinitionBuilder::new();
setup(&mut event_builder);
let event = event_builder.build();
let builder = EmitTaskDefinitionBuilder::new(event);
self.builder = Some(TaskDefinitionBuilder::Emit(builder));
if let Some(TaskDefinitionBuilder::Emit(ref mut builder)) = self.builder{
builder
}
else {
unreachable!("Builder should always be set to Emit");
}
}
pub fn for_(&mut self) -> &mut ForTaskDefinitionBuilder{
let builder = ForTaskDefinitionBuilder::new();
self.builder = Some(TaskDefinitionBuilder::For(builder));
if let Some(TaskDefinitionBuilder::For(ref mut builder)) = self.builder{
builder
}
else {
unreachable!("Builder should always be set to For");
}
}
pub fn fork(&mut self) -> &mut ForkTaskDefinitionBuilder{
let builder = ForkTaskDefinitionBuilder::new();
self.builder = Some(TaskDefinitionBuilder::Fork(builder));
if let Some(TaskDefinitionBuilder::Fork(ref mut builder)) = self.builder{
builder
}
else {
unreachable!("Builder should always be set to Fork");
}
}
pub fn listen(&mut self) -> &mut ListenTaskDefinitionBuilder{
let builder = ListenTaskDefinitionBuilder::new();
self.builder = Some(TaskDefinitionBuilder::Listen(builder));
if let Some(TaskDefinitionBuilder::Listen(ref mut builder)) = self.builder{
builder
}
else {
unreachable!("Builder should always be set to Listen");
}
}
pub fn raise(&mut self) -> &mut RaiseTaskDefinitionBuilder{
let builder = RaiseTaskDefinitionBuilder::new();
self.builder = Some(TaskDefinitionBuilder::Raise(builder));
if let Some(TaskDefinitionBuilder::Raise(ref mut builder)) = self.builder{
builder
}
else {
unreachable!("Builder should always be set to Raise");
}
}
pub fn run(&mut self) -> &mut RunTaskDefinitionBuilder{
let builder = RunTaskDefinitionBuilder::new();
self.builder = Some(TaskDefinitionBuilder::Run(builder));
if let Some(TaskDefinitionBuilder::Run(ref mut builder)) = self.builder{
builder
}
else {
unreachable!("Builder should always be set to Run");
}
}
pub fn set(&mut self) -> &mut SetTaskDefinitionBuilder{
let builder = SetTaskDefinitionBuilder::new();
self.builder = Some(TaskDefinitionBuilder::Set(builder));
if let Some(TaskDefinitionBuilder::Set(ref mut builder)) = self.builder{
builder
}
else {
unreachable!("Builder should always be set to Set");
}
}
pub fn switch(&mut self) -> &mut SwitchTaskDefinitionBuilder{
let builder = SwitchTaskDefinitionBuilder::new();
self.builder = Some(TaskDefinitionBuilder::Switch(builder));
if let Some(TaskDefinitionBuilder::Switch(ref mut builder)) = self.builder{
builder
}
else{
unreachable!("Builder should always be set to Switch");
}
}
pub fn try_(&mut self) -> &mut TryTaskDefinitionBuilder{
let builder = TryTaskDefinitionBuilder::new();
self.builder = Some(TaskDefinitionBuilder::Try(builder));
if let Some(TaskDefinitionBuilder::Try(ref mut builder)) = self.builder{
builder
}
else{
unreachable!("Builder should always be set to Try");
}
}
pub fn wait(&mut self, duration: OneOfDurationOrIso8601Expression) -> &mut WaitTaskDefinitionBuilder{
let builder = WaitTaskDefinitionBuilder::new(duration);
self.builder = Some(TaskDefinitionBuilder::Wait(builder));
if let Some(TaskDefinitionBuilder::Wait(ref mut builder)) = self.builder{
builder
}
else {
unreachable!("Builder should always be set to Wait");
}
}
pub fn build(self) -> TaskDefinition{
if let Some(builder) = self.builder {
match builder {
TaskDefinitionBuilder::Call(builder) => builder.build(),
TaskDefinitionBuilder::Do(builder) => builder.build(),
TaskDefinitionBuilder::Emit(builder) => builder.build(),
TaskDefinitionBuilder::For(builder) => builder.build(),
TaskDefinitionBuilder::Fork(builder) => builder.build(),
TaskDefinitionBuilder::Listen(builder) => builder.build(),
TaskDefinitionBuilder::Raise(builder) => builder.build(),
TaskDefinitionBuilder::Run(builder) => builder.build(),
TaskDefinitionBuilder::Set(builder) => builder.build(),
TaskDefinitionBuilder::Switch(builder) => builder.build(),
TaskDefinitionBuilder::Try(builder) => builder.build(),
TaskDefinitionBuilder::Wait(builder) => builder.build()
}
}
else {
panic!("The task must be configured");
}
}
}
pub enum TaskDefinitionBuilder{
Call(CalltaskDefinitionBuilder),
Do(DoTaskDefinitionBuilder),
Emit(EmitTaskDefinitionBuilder),
For(ForTaskDefinitionBuilder),
Fork(ForkTaskDefinitionBuilder),
Listen(ListenTaskDefinitionBuilder),
Raise(RaiseTaskDefinitionBuilder),
Run(RunTaskDefinitionBuilder),
Set(SetTaskDefinitionBuilder),
Switch(SwitchTaskDefinitionBuilder),
Try(TryTaskDefinitionBuilder),
Wait(WaitTaskDefinitionBuilder)
}
pub trait TaskDefinitionBuilderBase {
fn if_(&mut self, condition: &str) -> &mut Self;
fn with_timeout_reference(&mut self, reference: &str) -> &mut Self;
fn with_timeout<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut TimeoutDefinitionBuilder);
fn with_input<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut InputDataModelDefinitionBuilder);
fn with_output<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder);
fn with_export<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder);
fn then(&mut self, directive: &str) -> &mut Self;
fn build(self) -> TaskDefinition;
}
pub struct CalltaskDefinitionBuilder{
task: CallTaskDefinition
}
impl CalltaskDefinitionBuilder {
pub fn new(function: &str) -> Self{
Self { task: CallTaskDefinition::new(function, None, None) }
}
pub fn with(&mut self, name: &str, value: Value) -> &mut Self{
if self.task.with.is_none(){
self.task.with = Some(HashMap::new());
}
if let Some(with) = &mut self.task.with {
with.insert(name.to_string(), value);
}
self
}
pub fn with_arguments(&mut self, arguments: HashMap<String, Value>) -> &mut Self{
self.task.with = Some(arguments);
self
}
}
impl TaskDefinitionBuilderBase for CalltaskDefinitionBuilder{
fn if_(&mut self, condition: &str) -> &mut Self{
self.task.common.if_ = Some(condition.to_string());
self
}
fn with_timeout_reference(&mut self, reference: &str) -> &mut Self{
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Reference(reference.to_string()));
self
}
fn with_timeout<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut TimeoutDefinitionBuilder){
let mut builder = TimeoutDefinitionBuilder::new();
setup(&mut builder);
let timeout = builder.build();
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Timeout(timeout));
self
}
fn with_input<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut InputDataModelDefinitionBuilder){
let mut builder = InputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.input = Some(builder.build());
self
}
fn with_output<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.output = Some(builder.build());
self
}
fn with_export<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.export = Some(builder.build());
self
}
fn then(&mut self, directive: &str) -> &mut Self{
self.task.common.then = Some(directive.to_string());
self
}
fn build(self) -> TaskDefinition{
TaskDefinition::Call(self.task)
}
}
pub struct DoTaskDefinitionBuilder{
task: DoTaskDefinition
}
impl DoTaskDefinitionBuilder {
pub fn new() -> Self{
Self { task: DoTaskDefinition::default() }
}
pub fn do_<F>(&mut self, name: &str, setup: F) -> &mut Self
where F: FnOnce(&mut GenericTaskDefinitionBuilder){
let mut builder = GenericTaskDefinitionBuilder::new();
setup(&mut builder);
let task = builder.build();
self.task.do_.add(name.to_string(), task);
self
}
}
impl TaskDefinitionBuilderBase for DoTaskDefinitionBuilder{
fn if_(&mut self, condition: &str) -> &mut Self{
self.task.common.if_ = Some(condition.to_string());
self
}
fn with_timeout_reference(&mut self, reference: &str) -> &mut Self{
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Reference(reference.to_string()));
self
}
fn with_timeout<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut TimeoutDefinitionBuilder){
let mut builder = TimeoutDefinitionBuilder::new();
setup(&mut builder);
let timeout = builder.build();
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Timeout(timeout));
self
}
fn with_input<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut InputDataModelDefinitionBuilder){
let mut builder = InputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.input = Some(builder.build());
self
}
fn with_output<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.output = Some(builder.build());
self
}
fn with_export<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.export = Some(builder.build());
self
}
fn then(&mut self, directive: &str) -> &mut Self{
self.task.common.then = Some(directive.to_string());
self
}
fn build(self) -> TaskDefinition{
TaskDefinition::Do(self.task)
}
}
pub struct EmitTaskDefinitionBuilder{
task: EmitTaskDefinition
}
impl EmitTaskDefinitionBuilder {
pub fn new(event: EventDefinition) -> Self{
Self { task: EmitTaskDefinition::new(EventEmissionDefinition::new(event)) }
}
}
impl TaskDefinitionBuilderBase for EmitTaskDefinitionBuilder{
fn if_(&mut self, condition: &str) -> &mut Self{
self.task.common.if_ = Some(condition.to_string());
self
}
fn with_timeout_reference(&mut self, reference: &str) -> &mut Self{
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Reference(reference.to_string()));
self
}
fn with_timeout<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut TimeoutDefinitionBuilder){
let mut builder = TimeoutDefinitionBuilder::new();
setup(&mut builder);
let timeout = builder.build();
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Timeout(timeout));
self
}
fn with_input<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut InputDataModelDefinitionBuilder){
let mut builder = InputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.input = Some(builder.build());
self
}
fn with_output<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.output = Some(builder.build());
self
}
fn with_export<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.export = Some(builder.build());
self
}
fn then(&mut self, directive: &str) -> &mut Self{
self.task.common.then = Some(directive.to_string());
self
}
fn build(self) -> TaskDefinition{
TaskDefinition::Emit(self.task)
}
}
pub struct ForTaskDefinitionBuilder{
task: ForTaskDefinition
}
impl ForTaskDefinitionBuilder{
pub fn new() -> Self{
Self { task:ForTaskDefinition::default() }
}
pub fn each(&mut self, variable_name: &str) -> &mut Self{
self.task.for_.each = variable_name.to_string();
self
}
pub fn in_(&mut self, expression: &str) -> &mut Self{
self.task.for_.in_ = expression.to_string();
self
}
pub fn at(&mut self, variable_name: &str) -> &mut Self{
self.task.for_.at = Some(variable_name.to_string());
self
}
pub fn do_<F>(&mut self, name: &str, setup: F) -> &mut Self
where F: FnOnce(&mut GenericTaskDefinitionBuilder){
let mut builder = GenericTaskDefinitionBuilder::new();
setup(&mut builder);
let task = builder.build();
self.task.do_.add(name.to_string(), task);
self
}
}
impl TaskDefinitionBuilderBase for ForTaskDefinitionBuilder{
fn if_(&mut self, condition: &str) -> &mut Self{
self.task.common.if_ = Some(condition.to_string());
self
}
fn with_timeout_reference(&mut self, reference: &str) -> &mut Self{
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Reference(reference.to_string()));
self
}
fn with_timeout<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut TimeoutDefinitionBuilder){
let mut builder = TimeoutDefinitionBuilder::new();
setup(&mut builder);
let timeout = builder.build();
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Timeout(timeout));
self
}
fn with_input<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut InputDataModelDefinitionBuilder){
let mut builder = InputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.input = Some(builder.build());
self
}
fn with_output<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.output = Some(builder.build());
self
}
fn with_export<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.export = Some(builder.build());
self
}
fn then(&mut self, directive: &str) -> &mut Self{
self.task.common.then = Some(directive.to_string());
self
}
fn build(self) -> TaskDefinition{
TaskDefinition::For(self.task)
}
}
pub struct ForkTaskDefinitionBuilder{
task: ForkTaskDefinition
}
impl ForkTaskDefinitionBuilder{
pub fn new() -> Self{
Self { task:ForkTaskDefinition::default() }
}
pub fn branch<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut TaskDefinitionMapBuilder){
let mut builder = TaskDefinitionMapBuilder::new();
setup(&mut builder);
let branches = builder.build();
self.task.fork.branches = branches;
self
}
}
impl TaskDefinitionBuilderBase for ForkTaskDefinitionBuilder{
fn if_(&mut self, condition: &str) -> &mut Self{
self.task.common.if_ = Some(condition.to_string());
self
}
fn with_timeout_reference(&mut self, reference: &str) -> &mut Self{
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Reference(reference.to_string()));
self
}
fn with_timeout<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut TimeoutDefinitionBuilder){
let mut builder = TimeoutDefinitionBuilder::new();
setup(&mut builder);
let timeout = builder.build();
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Timeout(timeout));
self
}
fn with_input<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut InputDataModelDefinitionBuilder){
let mut builder = InputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.input = Some(builder.build());
self
}
fn with_output<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.output = Some(builder.build());
self
}
fn with_export<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.export = Some(builder.build());
self
}
fn then(&mut self, directive: &str) -> &mut Self{
self.task.common.then = Some(directive.to_string());
self
}
fn build(self) -> TaskDefinition{
TaskDefinition::Fork(self.task)
}
}
pub struct ListenTaskDefinitionBuilder{
task: ListenTaskDefinition
}
impl ListenTaskDefinitionBuilder{
pub fn new() -> Self{
Self { task:ListenTaskDefinition::default() }
}
pub fn to<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut EventConsumptionStrategyDefinitionBuilder){
let mut builder = EventConsumptionStrategyDefinitionBuilder::new();
setup(&mut builder);
let consumption_strategy = builder.build();
self.task.listen.to = consumption_strategy;
self
}
pub fn foreach<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut SubscriptionIteratorDefinitionBuilder){
let mut builder = SubscriptionIteratorDefinitionBuilder::new();
setup(&mut builder);
self.task.foreach = Some(builder.build());
self
}
}
impl TaskDefinitionBuilderBase for ListenTaskDefinitionBuilder{
fn if_(&mut self, condition: &str) -> &mut Self{
self.task.common.if_ = Some(condition.to_string());
self
}
fn with_timeout_reference(&mut self, reference: &str) -> &mut Self{
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Reference(reference.to_string()));
self
}
fn with_timeout<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut TimeoutDefinitionBuilder){
let mut builder = TimeoutDefinitionBuilder::new();
setup(&mut builder);
let timeout = builder.build();
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Timeout(timeout));
self
}
fn with_input<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut InputDataModelDefinitionBuilder){
let mut builder = InputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.input = Some(builder.build());
self
}
fn with_output<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.output = Some(builder.build());
self
}
fn with_export<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.export = Some(builder.build());
self
}
fn then(&mut self, directive: &str) -> &mut Self{
self.task.common.then = Some(directive.to_string());
self
}
fn build(self) -> TaskDefinition{
TaskDefinition::Listen(self.task)
}
}
pub struct RaiseTaskDefinitionBuilder{
common: TaskDefinitionFields,
builder: Option<ErrorDefinitionBuilder>,
reference: Option<String>
}
impl RaiseTaskDefinitionBuilder{
pub fn new() -> Self{
Self { common: TaskDefinitionFields::new(), builder: None, reference: None }
}
pub fn error(&mut self) -> &mut ErrorDefinitionBuilder{
let builder = ErrorDefinitionBuilder::new();
self.builder = Some(builder);
if let Some(ref mut error_builder) = self.builder{
error_builder
}
else {
unreachable!("Builder should always be set to Error");
}
}
pub fn referenced_error(&mut self, reference: &str){
self.reference = Some(reference.to_string());
}
}
impl TaskDefinitionBuilderBase for RaiseTaskDefinitionBuilder{
fn if_(&mut self, condition: &str) -> &mut Self{
self.common.if_ = Some(condition.to_string());
self
}
fn with_timeout_reference(&mut self, reference: &str) -> &mut Self{
self.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Reference(reference.to_string()));
self
}
fn with_timeout<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut TimeoutDefinitionBuilder){
let mut builder = TimeoutDefinitionBuilder::new();
setup(&mut builder);
let timeout = builder.build();
self.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Timeout(timeout));
self
}
fn with_input<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut InputDataModelDefinitionBuilder){
let mut builder = InputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.common.input = Some(builder.build());
self
}
fn with_output<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.common.output = Some(builder.build());
self
}
fn with_export<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.common.export = Some(builder.build());
self
}
fn then(&mut self, directive: &str) -> &mut Self{
self.common.then = Some(directive.to_string());
self
}
fn build(self) -> TaskDefinition{
let mut task = RaiseTaskDefinition::default();
if let Some(builder) = self.builder {
let error = builder.build();
task.raise = RaiseErrorDefinition::new(OneOfErrorDefinitionOrReference::Error(error));
}
else if let Some(reference) = self.reference{
task.raise = RaiseErrorDefinition::new(OneOfErrorDefinitionOrReference::Reference(reference));
}
else{
panic!("The error to raise must be configured");
}
task.common = self.common;
TaskDefinition::Raise(task)
}
}
pub struct RunTaskDefinitionBuilder{
common: TaskDefinitionFields,
builder : Option<ProcessDefinitionBuilder>
}
impl RunTaskDefinitionBuilder{
pub fn new() -> Self{
Self{ common: TaskDefinitionFields::new(), builder: None }
}
pub fn container(&mut self) -> &mut ContainerProcessDefinitionBuilder{
self.builder = Some(ProcessDefinitionBuilder::Container(ContainerProcessDefinitionBuilder::new()));
if let Some(ProcessDefinitionBuilder::Container(ref mut container_builder)) = self.builder {
container_builder
}
else {
unreachable!("Builder should always be set to Container");
}
}
pub fn script(&mut self) -> &mut ScriptProcessDefinitionBuilder{
self.builder = Some(ProcessDefinitionBuilder::Script(ScriptProcessDefinitionBuilder::new()));
if let Some(ProcessDefinitionBuilder::Script(ref mut script_builder)) = self.builder {
script_builder
}
else {
unreachable!("Builder should always be set to Script");
}
}
pub fn shell(&mut self) -> &mut ShellProcessDefinitionBuilder{
self.builder = Some(ProcessDefinitionBuilder::Shell(ShellProcessDefinitionBuilder::new()));
if let Some(ProcessDefinitionBuilder::Shell(ref mut shell_builder)) = self.builder {
shell_builder
}
else {
unreachable!("Builder should always be set to Shell");
}
}
pub fn workflow(&mut self) -> &mut WorkflowProcessDefinitionBuilder{
self.builder = Some(ProcessDefinitionBuilder::Workflow(WorkflowProcessDefinitionBuilder::new()));
if let Some(ProcessDefinitionBuilder::Workflow(ref mut workflow_builder)) = self.builder {
workflow_builder
}
else {
unreachable!("Builder should always be set to Workflow");
}
}
}
impl TaskDefinitionBuilderBase for RunTaskDefinitionBuilder{
fn if_(&mut self, condition: &str) -> &mut Self{
self.common.if_ = Some(condition.to_string());
self
}
fn with_timeout_reference(&mut self, reference: &str) -> &mut Self{
self.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Reference(reference.to_string()));
self
}
fn with_timeout<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut TimeoutDefinitionBuilder){
let mut builder = TimeoutDefinitionBuilder::new();
setup(&mut builder);
let timeout = builder.build();
self.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Timeout(timeout));
self
}
fn with_input<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut InputDataModelDefinitionBuilder){
let mut builder = InputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.common.input = Some(builder.build());
self
}
fn with_output<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.common.output = Some(builder.build());
self
}
fn with_export<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.common.export = Some(builder.build());
self
}
fn then(&mut self, directive: &str) -> &mut Self{
self.common.then = Some(directive.to_string());
self
}
fn build(self) -> TaskDefinition{
if let Some(builder) = self.builder {
let mut process = match builder {
ProcessDefinitionBuilder::Container(builder) => builder.build(),
ProcessDefinitionBuilder::Script(builder) => builder.build(),
ProcessDefinitionBuilder::Shell(builder) => builder.build(),
ProcessDefinitionBuilder::Workflow(builder) => builder.build()
};
process.common = self.common;
TaskDefinition::Run(process)
}
else{
panic!("The process to run must be configured");
}
}
}
pub struct SetTaskDefinitionBuilder{
task: SetTaskDefinition
}
impl SetTaskDefinitionBuilder{
pub fn new() -> Self{
Self { task: SetTaskDefinition::new() }
}
pub fn variable(&mut self, name: &str, value: Value) -> &mut Self{
self.task.set.insert(name.to_string(), value);
self
}
pub fn variables(&mut self, variables: HashMap<String, Value>) -> &mut Self{
self.task.set = variables;
self
}
}
impl TaskDefinitionBuilderBase for SetTaskDefinitionBuilder{
fn if_(&mut self, condition: &str) -> &mut Self{
self.task.common.if_ = Some(condition.to_string());
self
}
fn with_timeout_reference(&mut self, reference: &str) -> &mut Self{
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Reference(reference.to_string()));
self
}
fn with_timeout<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut TimeoutDefinitionBuilder){
let mut builder = TimeoutDefinitionBuilder::new();
setup(&mut builder);
let timeout = builder.build();
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Timeout(timeout));
self
}
fn with_input<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut InputDataModelDefinitionBuilder){
let mut builder = InputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.input = Some(builder.build());
self
}
fn with_output<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.output = Some(builder.build());
self
}
fn with_export<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.export = Some(builder.build());
self
}
fn then(&mut self, directive: &str) -> &mut Self{
self.task.common.then = Some(directive.to_string());
self
}
fn build(self) -> TaskDefinition{
TaskDefinition::Set(self.task)
}
}
pub struct SwitchTaskDefinitionBuilder{
task: SwitchTaskDefinition
}
impl SwitchTaskDefinitionBuilder{
pub fn new() -> Self{
Self { task: SwitchTaskDefinition::new() }
}
pub fn case<F>(&mut self, name: &str, setup: F) -> &mut Self
where F: FnOnce(&mut SwitchCaseDefinitionBuilder){
let mut builder = SwitchCaseDefinitionBuilder::new();
setup(&mut builder);
let case = builder.build();
self.task.switch.add(name.to_string(), case);
self
}
}
impl TaskDefinitionBuilderBase for SwitchTaskDefinitionBuilder{
fn if_(&mut self, condition: &str) -> &mut Self{
self.task.common.if_ = Some(condition.to_string());
self
}
fn with_timeout_reference(&mut self, reference: &str) -> &mut Self{
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Reference(reference.to_string()));
self
}
fn with_timeout<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut TimeoutDefinitionBuilder){
let mut builder = TimeoutDefinitionBuilder::new();
setup(&mut builder);
let timeout = builder.build();
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Timeout(timeout));
self
}
fn with_input<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut InputDataModelDefinitionBuilder){
let mut builder = InputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.input = Some(builder.build());
self
}
fn with_output<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.output = Some(builder.build());
self
}
fn with_export<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.export = Some(builder.build());
self
}
fn then(&mut self, directive: &str) -> &mut Self{
self.task.common.then = Some(directive.to_string());
self
}
fn build(self) -> TaskDefinition{
TaskDefinition::Switch(self.task)
}
}
pub struct TryTaskDefinitionBuilder{
task: TryTaskDefinition
}
impl TryTaskDefinitionBuilder{
pub fn new() -> Self{
Self { task: TryTaskDefinition::default() }
}
pub fn do_<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut TaskDefinitionMapBuilder){
let mut builder = TaskDefinitionMapBuilder::new();
setup(&mut builder);
self.task.try_ = builder.build();
self
}
pub fn catch<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut ErrorCatcherDefinitionBuilder){
let mut builder = ErrorCatcherDefinitionBuilder::new();
setup(&mut builder);
self.task.catch = builder.build();
self
}
}
impl TaskDefinitionBuilderBase for TryTaskDefinitionBuilder{
fn if_(&mut self, condition: &str) -> &mut Self{
self.task.common.if_ = Some(condition.to_string());
self
}
fn with_timeout_reference(&mut self, reference: &str) -> &mut Self{
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Reference(reference.to_string()));
self
}
fn with_timeout<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut TimeoutDefinitionBuilder){
let mut builder = TimeoutDefinitionBuilder::new();
setup(&mut builder);
let timeout = builder.build();
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Timeout(timeout));
self
}
fn with_input<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut InputDataModelDefinitionBuilder){
let mut builder = InputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.input = Some(builder.build());
self
}
fn with_output<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.output = Some(builder.build());
self
}
fn with_export<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.export = Some(builder.build());
self
}
fn then(&mut self, directive: &str) -> &mut Self{
self.task.common.then = Some(directive.to_string());
self
}
fn build(self) -> TaskDefinition{
TaskDefinition::Try(self.task)
}
}
pub struct WaitTaskDefinitionBuilder{
task: WaitTaskDefinition
}
impl WaitTaskDefinitionBuilder {
pub fn new(duration: OneOfDurationOrIso8601Expression) -> Self{
Self { task: WaitTaskDefinition::new(duration) }
}
}
impl TaskDefinitionBuilderBase for WaitTaskDefinitionBuilder{
fn if_(&mut self, condition: &str) -> &mut Self{
self.task.common.if_ = Some(condition.to_string());
self
}
fn with_timeout_reference(&mut self, reference: &str) -> &mut Self{
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Reference(reference.to_string()));
self
}
fn with_timeout<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut TimeoutDefinitionBuilder){
let mut builder = TimeoutDefinitionBuilder::new();
setup(&mut builder);
let timeout = builder.build();
self.task.common.timeout = Some(OneOfTimeoutDefinitionOrReference::Timeout(timeout));
self
}
fn with_input<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut InputDataModelDefinitionBuilder){
let mut builder = InputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.input = Some(builder.build());
self
}
fn with_output<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.output = Some(builder.build());
self
}
fn with_export<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.task.common.export = Some(builder.build());
self
}
fn then(&mut self, directive: &str) -> &mut Self{
self.task.common.then = Some(directive.to_string());
self
}
fn build(self) -> TaskDefinition{
TaskDefinition::Wait(self.task)
}
}
pub struct EventDefinitionBuilder{
event: EventDefinition
}
impl EventDefinitionBuilder{
pub fn new() -> Self{
Self { event: EventDefinition::default() }
}
pub fn with(&mut self, name: &str, value: Value) -> &mut Self{
self.event.with.insert(name.to_string(), value);
self
}
pub fn with_attributes(&mut self, attributes: HashMap<String, Value>) -> &mut Self{
self.event.with = attributes;
self
}
pub fn build(self) -> EventDefinition{
self.event
}
}
pub struct TaskDefinitionMapBuilder{
map: Map<String, TaskDefinition>
}
impl TaskDefinitionMapBuilder{
pub fn new() -> Self{
Self { map: Map::new() }
}
pub fn do_<F>(&mut self, name: &str, setup: F) -> &mut Self
where F: FnOnce(&mut GenericTaskDefinitionBuilder){
let mut builder = GenericTaskDefinitionBuilder::new();
setup(&mut builder);
let task = builder.build();
self.map.add(name.to_string(), task);
self
}
pub fn build(self) -> Map<String, TaskDefinition>{
self.map
}
}
pub struct EventConsumptionStrategyDefinitionBuilder{
all: Option<EventFilterDefinitionCollectionBuilder>,
any: Option<EventFilterDefinitionCollectionBuilder>,
one: Option<EventFilterDefinitionBuilder>,
until_condition: Option<String>,
until_events: Option<EventConsumptionStrategyDefinition>
}
impl EventConsumptionStrategyDefinitionBuilder{
pub fn new() -> Self{
Self { all: None, any: None, one: None, until_condition: None, until_events: None }
}
pub fn all(&mut self) -> &mut EventFilterDefinitionCollectionBuilder {
let builder = EventFilterDefinitionCollectionBuilder::new();
self.all = Some(builder);
if let Some(ref mut all_builder) = self.all{
all_builder
}
else {
unreachable!("Builder should always be set to All");
}
}
pub fn any(&mut self) -> &mut EventFilterDefinitionCollectionBuilder {
let builder = EventFilterDefinitionCollectionBuilder::new();
self.any = Some(builder);
if let Some(ref mut any_builder) = self.any{
any_builder
}
else {
unreachable!("Builder should always be set to Any");
}
}
pub fn one(&mut self) -> &mut EventFilterDefinitionBuilder {
let builder = EventFilterDefinitionBuilder::new();
self.one = Some(builder);
if let Some(ref mut one_builder) = self.one{
one_builder
}
else {
unreachable!("Builder should always be set to One");
}
}
pub fn until<F>(&mut self, setup: F)
where F: FnOnce(&mut EventConsumptionStrategyDefinitionBuilder){
let mut builder = EventConsumptionStrategyDefinitionBuilder::new();
setup(&mut builder);
self.until_events = Some(builder.build());
}
pub fn until_condition_matches(&mut self, expression: &str){
self.until_condition = Some(expression.to_string());
}
pub fn build(self) -> EventConsumptionStrategyDefinition{
let mut strategy = EventConsumptionStrategyDefinition::default();
if let Some(all_builder) = self.all {
strategy.all = Some(all_builder.build());
}
else if let Some(any_builder) = self.any {
strategy.any = Some(any_builder.build());
if let Some(expression) = self.until_condition{
strategy.until = Some(Box::new(OneOfEventConsumptionStrategyDefinitionOrExpression::Expression(expression.to_string())));
}
else if let Some(until_events) = self.until_events{
strategy.until = Some(Box::new(OneOfEventConsumptionStrategyDefinitionOrExpression::Strategy(until_events)));
}
}
else if let Some(one_builder) = self.one {
strategy.one = Some(one_builder.build());
}
else{
panic!("No strategy defined!");
}
strategy
}
}
pub struct EventFilterDefinitionCollectionBuilder{
events: Vec<EventFilterDefinition>
}
impl EventFilterDefinitionCollectionBuilder{
pub fn new() -> Self{
Self { events: Vec::new() }
}
pub fn event<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut EventFilterDefinitionBuilder){
let mut builder = EventFilterDefinitionBuilder::new();
setup(&mut builder);
let filter = builder.build();
self.events.push(filter);
self
}
pub fn build(self) -> Vec<EventFilterDefinition>{
self.events
}
}
pub struct EventFilterDefinitionBuilder{
filter: EventFilterDefinition
}
impl EventFilterDefinitionBuilder{
pub fn new() -> Self{
Self { filter: EventFilterDefinition::default() }
}
pub fn with(&mut self, name: &str, value: Value) -> &mut Self{
if self.filter.with.is_none(){
self.filter.with = Some(HashMap::new());
}
if let Some(with) = &mut self.filter.with {
with.insert(name.to_string(), value);
}
self
}
pub fn with_attributes(&mut self, attributes: HashMap<String, Value>) -> &mut Self{
self.filter.with = Some(attributes);
self
}
pub fn build(self) -> EventFilterDefinition{
self.filter
}
}
pub struct SubscriptionIteratorDefinitionBuilder{
iterator: SubscriptionIteratorDefinition
}
impl SubscriptionIteratorDefinitionBuilder{
pub fn new() -> Self{
Self { iterator: SubscriptionIteratorDefinition::new() }
}
pub fn with_item(&mut self, variable: &str) -> &mut Self{
self.iterator.item = Some(variable.to_string());
self
}
pub fn at(&mut self, variable: &str) -> &mut Self{
self.iterator.at = Some(variable.to_string());
self
}
pub fn do_<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut TaskDefinitionMapBuilder){
let mut builder = TaskDefinitionMapBuilder::new();
setup(& mut builder);
self.iterator.do_ = Some(builder.build());
self
}
pub fn with_output<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.iterator.output = Some(builder.build());
self
}
pub fn with_export<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut OutputDataModelDefinitionBuilder){
let mut builder = OutputDataModelDefinitionBuilder::new();
setup(&mut builder);
self.iterator.export = Some(builder.build());
self
}
pub fn build(self) -> SubscriptionIteratorDefinition{
self.iterator
}
}
pub struct ErrorDefinitionBuilder{
error: ErrorDefinition
}
impl ErrorDefinitionBuilder{
pub fn new() -> Self{
Self { error: ErrorDefinition::default() }
}
pub fn with_type(&mut self, type_: &str) -> &mut Self{
self.error.type_ = type_.to_string();
self
}
pub fn with_status(&mut self, status: Value) -> &mut Self{
self.error.status = status;
self
}
pub fn with_title(&mut self, title: &str) -> &mut Self{
self.error.title = title.to_string();
self
}
pub fn with_detail(&mut self, detail: &str) -> &mut Self{
self.error.detail = Some(detail.to_string());
self
}
pub fn with_instance(&mut self, instance: &str) -> &mut Self{
self.error.instance = Some(instance.to_string());
self
}
pub fn build(self) -> ErrorDefinition{
self.error
}
}
pub enum ProcessDefinitionBuilder{
Container(ContainerProcessDefinitionBuilder),
Script(ScriptProcessDefinitionBuilder),
Shell(ShellProcessDefinitionBuilder),
Workflow(WorkflowProcessDefinitionBuilder)
}
pub struct ContainerProcessDefinitionBuilder{
process: ContainerProcessDefinition
}
impl ContainerProcessDefinitionBuilder{
pub fn new() -> Self{
Self { process: ContainerProcessDefinition::default() }
}
pub fn with_name(&mut self, name: &str) -> &mut Self{
self.process.name = Some(name.to_string());
self
}
pub fn with_image(&mut self, image: &str) -> &mut Self{
self.process.image = image.to_string();
self
}
pub fn with_command(&mut self, command: &str) -> &mut Self{
self.process.command = Some(command.to_string());
self
}
pub fn with_port(&mut self, host_port: u16, container_port: u16) -> &mut Self{
if self.process.ports.is_none(){
self.process.ports = Some(HashMap::new());
}
if let Some(ports) = &mut self.process.ports {
ports.insert(host_port, container_port);
}
self
}
pub fn with_ports(&mut self, ports: HashMap<u16, u16>) -> &mut Self{
self.process.ports = Some(ports);
self
}
pub fn with_volume(&mut self, key: &str, value: &str) -> &mut Self{
if self.process.volumes.is_none(){
self.process.volumes = Some(HashMap::new());
}
if let Some(volumes) = &mut self.process.volumes {
volumes.insert(key.to_string(), value.to_string());
}
self
}
pub fn with_volumes(&mut self, volumes: HashMap<String, String>) -> &mut Self{
self.process.volumes = Some(volumes);
self
}
pub fn with_environment(&mut self, name: &str, value: &str) -> &mut Self{
if self.process.environment.is_none(){
self.process.environment = Some(HashMap::new());
}
if let Some(environment) = &mut self.process.environment {
environment.insert(name.to_string(), value.to_string());
}
self
}
pub fn with_environment_variables(&mut self, environment: HashMap<String, String>) -> &mut Self{
self.process.environment = Some(environment);
self
}
pub fn build(self) -> RunTaskDefinition{
let mut run_task = RunTaskDefinition::default();
run_task.run.container = Some(self.process);
run_task
}
}
pub struct ScriptProcessDefinitionBuilder{
process: ScriptProcessDefinition
}
impl ScriptProcessDefinitionBuilder{
pub fn new() -> Self{
Self { process: ScriptProcessDefinition::default() }
}
pub fn with_language(&mut self, language: &str) -> &mut Self{
self.process.language = language.to_string();
self
}
pub fn with_code(&mut self, code: &str) -> &mut Self{
self.process.code = Some(code.to_string());
self
}
pub fn with_source<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut ExternalResourceDefinitionBuilder){
let mut builder = ExternalResourceDefinitionBuilder::new();
setup(&mut builder);
let resource = builder.build();
self.process.source = Some(resource);
self
}
pub fn with_argument(&mut self, key: &str, value: &str) -> &mut Self{
if self.process.arguments.is_none(){
self.process.arguments = Some(HashMap::new());
}
if let Some(arguments) = &mut self.process.arguments {
arguments.insert(key.to_string(), value.to_string());
}
self
}
pub fn with_arguments(&mut self, arguments: HashMap<String, String>) -> &mut Self{
self.process.arguments = Some(arguments);
self
}
pub fn with_environment(&mut self, name: &str, value: &str) -> &mut Self{
if self.process.environment.is_none(){
self.process.environment = Some(HashMap::new());
}
if let Some(environment) = &mut self.process.environment {
environment.insert(name.to_string(), value.to_string());
}
self
}
pub fn with_environment_variables(&mut self, environment: HashMap<String, String>) -> &mut Self{
self.process.environment = Some(environment);
self
}
pub fn build(self) -> RunTaskDefinition{
let mut run_task = RunTaskDefinition::default();
run_task.run.script = Some(self.process);
run_task
}
}
pub struct ShellProcessDefinitionBuilder{
process: ShellProcessDefinition
}
impl ShellProcessDefinitionBuilder{
pub fn new() -> Self{
Self { process: ShellProcessDefinition::default() }
}
pub fn with_command(&mut self, command: &str) -> &mut Self{
self.process.command = command.to_string();
self
}
pub fn with_argument(&mut self, argument: &str) -> &mut Self{
if self.process.arguments.is_none(){
self.process.arguments = Some(Vec::new());
}
if let Some(arguments) = &mut self.process.arguments {
arguments.push(argument.to_string());
}
self
}
pub fn with_arguments(&mut self, arguments: Vec<String>) -> &mut Self{
self.process.arguments = Some(arguments);
self
}
pub fn with_environment(&mut self, name: &str, value: &str) -> &mut Self{
if self.process.environment.is_none(){
self.process.environment = Some(HashMap::new());
}
if let Some(environment) = &mut self.process.environment {
environment.insert(name.to_string(), value.to_string());
}
self
}
pub fn with_environment_variables(&mut self, environment: HashMap<String, String>) -> &mut Self{
self.process.environment = Some(environment);
self
}
pub fn build(self) -> RunTaskDefinition{
let mut run_task = RunTaskDefinition::default();
run_task.run.shell = Some(self.process);
run_task
}
}
pub struct WorkflowProcessDefinitionBuilder{
process: WorkflowProcessDefinition
}
impl WorkflowProcessDefinitionBuilder{
pub fn new() -> Self{
Self { process: WorkflowProcessDefinition::default() }
}
pub fn with_namespace(&mut self, namespace: &str) -> &mut Self{
self.process.namespace = namespace.to_string();
self
}
pub fn with_name(&mut self, name: &str) -> &mut Self{
self.process.name = name.to_string();
self
}
pub fn with_version(&mut self, version: &str) -> &mut Self{
self.process.version = version.to_string();
self
}
pub fn with_input(&mut self, input: Value) -> &mut Self{
self.process.input = Some(input);
self
}
pub fn build(self) -> RunTaskDefinition{
let mut run_task = RunTaskDefinition::default();
run_task.run.workflow = Some(self.process);
run_task
}
}
pub struct ExternalResourceDefinitionBuilder{
resource: ExternalResourceDefinition
}
impl ExternalResourceDefinitionBuilder{
pub fn new() -> Self{
Self { resource:ExternalResourceDefinition::default() }
}
pub fn with_name(&mut self, name: &str) -> &mut Self{
self.resource.name = Some(name.to_string());
self
}
pub fn with_endpoint<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut EndpointDefinitionBuilder){
let mut builder = EndpointDefinitionBuilder::new();
setup(&mut builder);
let endpoint = builder.build();
self.resource.endpoint = OneOfEndpointDefinitionOrUri::Endpoint(endpoint);
self
}
pub fn with_endpoint_uri(&mut self, uri: &str) -> &mut Self{
self.resource.endpoint = OneOfEndpointDefinitionOrUri::Uri(uri.to_string());
self
}
pub fn build(self) -> ExternalResourceDefinition{
self.resource
}
}
pub struct EndpointDefinitionBuilder{
endpoint: EndpointDefinition
}
impl EndpointDefinitionBuilder{
pub fn new() -> Self{
Self { endpoint: EndpointDefinition::default() }
}
pub fn with_uri(&mut self, uri: &str) -> &mut Self{
self.endpoint.uri = uri.to_string();
self
}
pub fn with_authentication<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut AuthenticationPolicyDefinitionBuilder){
let mut builder = AuthenticationPolicyDefinitionBuilder::new();
setup(&mut builder);
let authentication = builder.build();
self.endpoint.authentication = Some(authentication);
self
}
pub fn build(self) -> EndpointDefinition{
self.endpoint
}
}
pub struct SwitchCaseDefinitionBuilder{
case: SwitchCaseDefinition
}
impl SwitchCaseDefinitionBuilder{
pub fn new() -> Self{
Self { case: SwitchCaseDefinition::default() }
}
pub fn when(&mut self, expression: &str) -> &mut Self{
self.case.when = Some(expression.to_string());
self
}
pub fn then(&mut self, directive: &str) -> &mut Self{
self.case.then = Some(directive.to_string());
self
}
pub fn build(self) -> SwitchCaseDefinition{
self.case
}
}
pub struct ErrorCatcherDefinitionBuilder{
catch: ErrorCatcherDefinition
}
impl ErrorCatcherDefinitionBuilder{
pub fn new() -> Self{
Self { catch: ErrorCatcherDefinition::default() }
}
pub fn errors<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut ErrroFilterDefinitionBuilder){
let mut builder = ErrroFilterDefinitionBuilder::new();
setup(&mut builder);
self.catch.errors = Some(builder.build());
self
}
pub fn as_(&mut self, variable: &str) -> &mut Self{
self.catch.as_ = Some(variable.to_string());
self
}
pub fn when(&mut self, expression: &str) -> &mut Self{
self.catch.when = Some(expression.to_string());
self
}
pub fn except_when(&mut self, expression: &str) -> &mut Self{
self.catch.except_when = Some(expression.to_string());
self
}
pub fn retry<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut RetryPolicyDefinitionBuilder){
let mut builder = RetryPolicyDefinitionBuilder::new();
setup(&mut builder);
self.catch.retry = Some(OneOfRetryPolicyDefinitionOrReference::Retry(builder.build()));
self
}
pub fn retry_using(&mut self, reference: &str) -> &mut Self{
self.catch.retry = Some(OneOfRetryPolicyDefinitionOrReference::Reference(reference.to_string()));
self
}
pub fn do_<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut TaskDefinitionMapBuilder){
let mut builder = TaskDefinitionMapBuilder::new();
setup(&mut builder);
self.catch.do_ = Some(builder.build());
self
}
pub fn build(self) -> ErrorCatcherDefinition{
self.catch
}
}
pub struct ErrroFilterDefinitionBuilder{
filter: ErrorFilterDefinition
}
impl ErrroFilterDefinitionBuilder{
pub fn new() -> Self{
Self { filter: ErrorFilterDefinition::default() }
}
pub fn with(&mut self, name: &str, value: Value) -> &mut Self{
if self.filter.with.is_none(){
self.filter.with = Some(HashMap::new());
}
if let Some(with) = &mut self.filter.with {
with.insert(name.to_string(), value);
}
self
}
pub fn with_attributes(&mut self, attributes: HashMap<String, Value>) -> &mut Self{
self.filter.with = Some(attributes);
self
}
pub fn build(self) -> ErrorFilterDefinition{
self.filter
}
}
pub struct RetryPolicyDefinitionBuilder{
retry: RetryPolicyDefinition
}
impl RetryPolicyDefinitionBuilder{
pub fn new() -> Self{
Self { retry: RetryPolicyDefinition::default() }
}
pub fn when(&mut self, expression: &str) -> &mut Self{
self.retry.when = Some(expression.to_string());
self
}
pub fn except_when(&mut self, expression: &str) -> &mut Self{
self.retry.except_when = Some(expression.to_string());
self
}
pub fn limit<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut RetryPolicyLimitDefinitionBuilder){
let mut builder = RetryPolicyLimitDefinitionBuilder::new();
setup(&mut builder);
self.retry.limit = Some(builder.build());
self
}
pub fn delay(&mut self, duration: Duration) -> &mut Self{
self.retry.delay = Some(duration);
self
}
pub fn backoff<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut GenericBackoffStrategyDefinitionBuilder){
let mut builder = GenericBackoffStrategyDefinitionBuilder::new();
setup(&mut builder);
self.retry.backoff = Some(builder.build());
self
}
pub fn jitter<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut JitterDefinitionBuilder){
let mut builder = JitterDefinitionBuilder::new();
setup(&mut builder);
self.retry.jitter = Some(builder.build());
self
}
pub fn build(self) -> RetryPolicyDefinition{
self.retry
}
}
pub struct RetryPolicyLimitDefinitionBuilder{
limit: RetryPolicyLimitDefinition
}
impl RetryPolicyLimitDefinitionBuilder{
pub fn new() -> Self{
Self { limit: RetryPolicyLimitDefinition::default() }
}
pub fn attempt<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut RetryAttemptLimitDefinitionBuilder){
let mut builder = RetryAttemptLimitDefinitionBuilder::new();
setup(&mut builder);
self.limit.attempt = Some(builder.build());
self
}
pub fn duration(&mut self, duration: Duration) -> &mut Self{
self.limit.duration = Some(duration);
self
}
pub fn build(self) -> RetryPolicyLimitDefinition{
self.limit
}
}
pub struct RetryAttemptLimitDefinitionBuilder{
attempt: RetryAttemptLimitDefinition
}
impl RetryAttemptLimitDefinitionBuilder{
pub fn new() -> Self{
Self { attempt: RetryAttemptLimitDefinition::default() }
}
pub fn count(&mut self, count: u16) -> &mut Self{
self.attempt.count = Some(count);
self
}
pub fn duration(&mut self, duration: Duration) -> &mut Self{
self.attempt.duration = Some(duration);
self
}
pub fn build(self) -> RetryAttemptLimitDefinition{
self.attempt
}
}
pub struct GenericBackoffStrategyDefinitionBuilder{
builder: Option<BackoffStrategyDefinitionBuilder>
}
impl GenericBackoffStrategyDefinitionBuilder{
pub fn new() -> Self{
Self { builder: None }
}
pub fn constant(&mut self) -> &mut ConstantBackoffDefinitionBuilder{
let builder = ConstantBackoffDefinitionBuilder::new();
self.builder = Some(BackoffStrategyDefinitionBuilder::Constant(builder));
if let Some(BackoffStrategyDefinitionBuilder::Constant(ref mut builder)) = self.builder{
builder
}
else{
unreachable!("Builder should always be set to Constant");
}
}
pub fn exponential(&mut self) -> &mut ExponentialBackoffDefinitionBuilder{
let builder = ExponentialBackoffDefinitionBuilder::new();
self.builder = Some(BackoffStrategyDefinitionBuilder::Exponential(builder));
if let Some(BackoffStrategyDefinitionBuilder::Exponential(ref mut builder)) = self.builder{
builder
}
else{
unreachable!("Builder should always be set to Exponential");
}
}
pub fn linear(&mut self) -> &mut LinearBackoffDefinitionBuilder{
let builder = LinearBackoffDefinitionBuilder::new();
self.builder = Some(BackoffStrategyDefinitionBuilder::Linear(builder));
if let Some(BackoffStrategyDefinitionBuilder::Linear(ref mut builder)) = self.builder{
builder
}
else{
unreachable!("Builder should always be set to Linear");
}
}
pub fn build(self) -> BackoffStrategyDefinition{
if let Some(builder) = self.builder{
match builder{
BackoffStrategyDefinitionBuilder::Constant(builder) => builder.build(),
BackoffStrategyDefinitionBuilder::Exponential(builder) => builder.build(),
BackoffStrategyDefinitionBuilder::Linear(builder) => builder.build(),
}
}
else{
unreachable!("The backoff strategy must be configured")
}
}
}
pub enum BackoffStrategyDefinitionBuilder{
Constant(ConstantBackoffDefinitionBuilder),
Exponential(ExponentialBackoffDefinitionBuilder),
Linear(LinearBackoffDefinitionBuilder)
}
pub struct ConstantBackoffDefinitionBuilder;
impl ConstantBackoffDefinitionBuilder{
pub fn new() -> Self{
Self{}
}
pub fn build(self) -> BackoffStrategyDefinition{
let mut strategy = BackoffStrategyDefinition::new();
strategy.constant = Some(ConstantBackoffDefinition::new());
strategy
}
}
pub struct ExponentialBackoffDefinitionBuilder;
impl ExponentialBackoffDefinitionBuilder{
pub fn new() -> Self{
Self{}
}
pub fn build(self) -> BackoffStrategyDefinition{
let mut strategy = BackoffStrategyDefinition::new();
strategy.exponential = Some(ExponentialBackoffDefinition::new());
strategy
}
}
pub struct LinearBackoffDefinitionBuilder{
increment: Option<Duration>
}
impl LinearBackoffDefinitionBuilder{
pub fn new() -> Self{
Self{ increment: None }
}
pub fn with_increment(&mut self, increment: Duration) -> &mut Self{
self.increment = Some(increment);
self
}
pub fn build(self) -> BackoffStrategyDefinition{
let mut strategy = BackoffStrategyDefinition::new();
let mut linear = LinearBackoffDefinition::new();
linear.increment = self.increment;
strategy.linear = Some(linear);
strategy
}
}
pub struct JitterDefinitionBuilder{
jitter: JitterDefinition
}
impl JitterDefinitionBuilder{
pub fn new() -> Self{
Self { jitter: JitterDefinition::default() }
}
pub fn from(&mut self, duration: Duration) -> &mut Self{
self.jitter.from = duration;
self
}
pub fn to(&mut self, duration: Duration) -> &mut Self{
self.jitter.to = duration;
self
}
pub fn build(self) -> JitterDefinition{
self.jitter
}
}
pub struct InputDataModelDefinitionBuilder{
input : InputDataModelDefinition
}
impl InputDataModelDefinitionBuilder{
pub fn new() -> Self{
Self{ input: InputDataModelDefinition::default() }
}
pub fn with_schema<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut SchemaDefinitionBuilder){
let mut builder = SchemaDefinitionBuilder::new();
setup(&mut builder);
self.input.schema = Some(builder.build());
self
}
pub fn from(&mut self, expression: Value) -> &mut Self{
self.input.from = Some(expression);
self
}
pub fn build(self) -> InputDataModelDefinition{
self.input
}
}
pub struct OutputDataModelDefinitionBuilder{
output : OutputDataModelDefinition
}
impl OutputDataModelDefinitionBuilder{
pub fn new() -> Self{
Self{ output: OutputDataModelDefinition::default() }
}
pub fn as_(&mut self, expression: Value) -> &mut Self{
self.output.as_ = Some(expression);
self
}
pub fn build(self) -> OutputDataModelDefinition{
self.output
}
}
pub struct SchemaDefinitionBuilder{
schema: SchemaDefinition
}
impl SchemaDefinitionBuilder{
pub fn new() -> Self{
Self { schema: SchemaDefinition::default() }
}
pub fn with_format(&mut self, format: &str) -> &mut Self{
self.schema.format = format.to_string();
self
}
pub fn with_resource<F>(&mut self, setup: F) -> &mut Self
where F: FnOnce(&mut ExternalResourceDefinitionBuilder){
let mut builder = ExternalResourceDefinitionBuilder::new();
setup(&mut builder);
self.schema.resource = Some(builder.build());
self
}
pub fn with_document(&mut self, document: Value) -> &mut Self{
self.schema.document = Some(document);
self
}
pub fn build(self) -> SchemaDefinition{
self.schema
}
}