use super::*;
#[derive(Default)]
pub struct TaskDefinitionBuilder {
builder: Option<TaskBuilderVariant>,
}
impl TaskDefinitionBuilder {
pub fn new() -> Self {
Self::default()
}
task_variant_method!(call, Call, CallFunctionTaskDefinitionBuilder, function: &str);
task_variant_method!(do_, Do, DoTaskDefinitionBuilder);
task_variant_method!(for_, For, ForTaskDefinitionBuilder);
task_variant_method!(fork, Fork, ForkTaskDefinitionBuilder);
task_variant_method!(listen, Listen, ListenTaskDefinitionBuilder);
task_variant_method!(raise, Raise, RaiseTaskDefinitionBuilder);
task_variant_method!(run, Run, RunTaskDefinitionBuilder);
task_variant_method!(set, Set, SetTaskDefinitionBuilder);
task_variant_method!(switch, Switch, SwitchTaskDefinitionBuilder);
task_variant_method!(try_, Try, TryTaskDefinitionBuilder);
task_variant_method!(wait, Wait, WaitTaskDefinitionBuilder, duration: OneOfDurationOrIso8601Expression);
pub fn emit<F>(&mut self, setup: F) -> &mut EmitTaskDefinitionBuilder
where
F: FnOnce(&mut EventDefinitionBuilder),
{
let mut event_builder = EventDefinitionBuilder::new();
setup(&mut event_builder);
let event = event_builder.build();
let builder = EmitTaskDefinitionBuilder::new(event);
self.builder = Some(TaskBuilderVariant::Emit(Box::new(builder)));
match &mut self.builder {
Some(TaskBuilderVariant::Emit(ref mut builder)) => builder,
_ => unreachable!("Builder should always be set to Emit"),
}
}
pub fn build(self) -> TaskDefinition {
if let Some(builder) = self.builder {
match builder {
TaskBuilderVariant::Call(builder) => builder.build(),
TaskBuilderVariant::Do(builder) => builder.build(),
TaskBuilderVariant::Emit(builder) => builder.build(),
TaskBuilderVariant::For(builder) => builder.build(),
TaskBuilderVariant::Fork(builder) => builder.build(),
TaskBuilderVariant::Listen(builder) => builder.build(),
TaskBuilderVariant::Raise(builder) => builder.build(),
TaskBuilderVariant::Run(builder) => builder.build(),
TaskBuilderVariant::Set(builder) => builder.build(),
TaskBuilderVariant::Switch(builder) => builder.build(),
TaskBuilderVariant::Try(builder) => builder.build(),
TaskBuilderVariant::Wait(builder) => builder.build(),
}
} else {
panic!("The task must be configured");
}
}
}
pub(crate) enum TaskBuilderVariant {
Call(Box<CallFunctionTaskDefinitionBuilder>),
Do(Box<DoTaskDefinitionBuilder>),
Emit(Box<EmitTaskDefinitionBuilder>),
For(Box<ForTaskDefinitionBuilder>),
Fork(Box<ForkTaskDefinitionBuilder>),
Listen(Box<ListenTaskDefinitionBuilder>),
Raise(Box<RaiseTaskDefinitionBuilder>),
Run(Box<RunTaskDefinitionBuilder>),
Set(Box<SetTaskDefinitionBuilder>),
Switch(Box<SwitchTaskDefinitionBuilder>),
Try(Box<TryTaskDefinitionBuilder>),
Wait(Box<WaitTaskDefinitionBuilder>),
}
#[allow(dead_code)]
pub(crate) 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;
}