Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import io.serverlessworkflow.fluent.func.spi.FuncDoFluent;
import io.serverlessworkflow.fluent.func.spi.FuncTaskTransformations;
import io.serverlessworkflow.fluent.spec.BaseDoTaskBuilder;
import io.serverlessworkflow.fluent.spec.WorkflowTaskBuilder;
import java.util.function.Consumer;

public class FuncDoTaskBuilder extends BaseDoTaskBuilder<FuncDoTaskBuilder, FuncTaskItemListBuilder>
Expand Down Expand Up @@ -103,6 +104,24 @@ public FuncDoTaskBuilder openapi(
return this;
}

@Override
public FuncDoTaskBuilder workflow(String name, Consumer<WorkflowTaskBuilder> itemsConfigurer) {
this.listBuilder().workflow(name, itemsConfigurer);
return this;
}

@Override
public FuncDoTaskBuilder subflow(String name, Consumer<WorkflowTaskBuilder> itemsConfigurer) {
this.listBuilder().subflow(name, itemsConfigurer);
return this;
}

@Override
public FuncDoTaskBuilder subflow(Consumer<WorkflowTaskBuilder> itemsConfigurer) {
this.listBuilder().subflow(itemsConfigurer);
return this;
}

@Override
public FuncDoTaskBuilder tryCatch(String name, Consumer<FuncTryTaskBuilder> itemsConfigurer) {
this.listBuilder().tryCatch(name, itemsConfigurer);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
import io.serverlessworkflow.api.types.TaskItem;
import io.serverlessworkflow.fluent.func.spi.FuncDoFluent;
import io.serverlessworkflow.fluent.spec.BaseTaskItemListBuilder;
import io.serverlessworkflow.fluent.spec.TaskItemListBuilder;
import io.serverlessworkflow.fluent.spec.WorkflowTaskBuilder;
import java.util.List;
import java.util.function.Consumer;

Expand Down Expand Up @@ -165,6 +167,46 @@ public FuncTaskItemListBuilder openapi(
return this.addTaskItem(new TaskItem(name, task));
}

@Override
public FuncTaskItemListBuilder workflow(
String name, Consumer<WorkflowTaskBuilder> itemsConfigurer) {
return this.addDelegatedWorkflow(name, itemsConfigurer, TYPE_WORKFLOW);
}

@Override
public FuncTaskItemListBuilder workflow(Consumer<WorkflowTaskBuilder> itemsConfigurer) {
return this.workflow(null, itemsConfigurer);
}
Comment thread
matheusandre1 marked this conversation as resolved.

@Override
public FuncTaskItemListBuilder subflow(
String name, Consumer<WorkflowTaskBuilder> itemsConfigurer) {
return this.addDelegatedWorkflow(name, itemsConfigurer, TYPE_WORKFLOW);
}

@Override
public FuncTaskItemListBuilder subflow(Consumer<WorkflowTaskBuilder> itemsConfigurer) {
return this.subflow(null, itemsConfigurer);
}
Comment thread
matheusandre1 marked this conversation as resolved.

private FuncTaskItemListBuilder addDelegatedWorkflow(
String name, Consumer<WorkflowTaskBuilder> itemsConfigurer, String delegateType) {
name = this.defaultNameAndRequireConfig(name, itemsConfigurer, delegateType);
// Preserve the original offset when delegating to avoid duplicate task names
// across appended .tasks(...) blocks
final int effectiveOffset = this.getOffset() + this.mutableList().size();
final TaskItemListBuilder delegate = new TaskItemListBuilder(effectiveOffset);
delegate.workflow(name, itemsConfigurer);
Comment thread
matheusandre1 marked this conversation as resolved.
final List<TaskItem> taskItems = delegate.build();
if (taskItems.size() != 1) {
throw new IllegalStateException(
String.format(
"Expected %s delegate '%s' to build exactly 1 TaskItem, but got %d",
delegateType, name, taskItems.size()));
}
return addTaskItem(taskItems.get(0));
}

@Override
public FuncTaskItemListBuilder tryCatch(
String name, Consumer<FuncTryTaskBuilder> itemsConfigurer) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,12 @@
import io.serverlessworkflow.fluent.spec.EventFilterBuilder;
import io.serverlessworkflow.fluent.spec.ScheduleBuilder;
import io.serverlessworkflow.fluent.spec.TimeoutBuilder;
import io.serverlessworkflow.fluent.spec.WorkflowTaskBuilder;
import io.serverlessworkflow.fluent.spec.configurers.AuthenticationConfigurer;
import io.serverlessworkflow.fluent.spec.configurers.WorkflowConfigurer;
import io.serverlessworkflow.fluent.spec.dsl.DSL;
import io.serverlessworkflow.fluent.spec.dsl.UseSpec;
import io.serverlessworkflow.fluent.spec.dsl.WorkflowSpec;
import io.serverlessworkflow.impl.TaskContextData;
import io.serverlessworkflow.impl.WorkflowContextData;
import java.net.URI;
Expand Down Expand Up @@ -1116,6 +1119,107 @@ public static FuncTaskConfigurer set(Map<String, Object> map) {
return list -> list.set(s -> s.expr(map));
}

/**
* Create a {@link FuncTaskConfigurer} that adds a sub-workflow call task using a {@link
* WorkflowConfigurer}.
*
* <pre>{@code
* tasks(
* subflow(
* workflow("org.acme", "sub-workflow", "0.1.0")
* .input("id", 99)
* .await(false)
* )
* );
* }</pre>
*
* @param configurer nested workflow configurer
* @return a {@link FuncTaskConfigurer} that adds a workflow task to the tasks list
*/
public static FuncTaskConfigurer subflow(WorkflowConfigurer configurer) {
Objects.requireNonNull(configurer, "configurer");
return list -> list.subflow(configurer);
}

/**
* Create a {@link FuncTaskConfigurer} that adds a named sub-workflow call task.
*
* @param name task name
* @param configurer nested workflow configurer
* @return a {@link FuncTaskConfigurer} that adds a workflow task to the tasks list
*/
public static FuncTaskConfigurer subflow(String name, Consumer<WorkflowTaskBuilder> configurer) {
Objects.requireNonNull(name, "name");
Objects.requireNonNull(configurer, "configurer");
return list -> list.subflow(name, configurer);
}

/**
* Create a {@link FuncTaskConfigurer} that adds an unnamed sub-workflow call task.
*
* @param configurer nested workflow configurer
* @return a {@link FuncTaskConfigurer} that adds a workflow task to the tasks list
*/
public static FuncTaskConfigurer subflow(Consumer<WorkflowTaskBuilder> configurer) {
Objects.requireNonNull(configurer, "configurer");
return list -> list.subflow(configurer);
}

/**
* Alias for {@link #subflow(WorkflowConfigurer)}.
*
* @param configurer nested workflow configurer
* @return a {@link FuncTaskConfigurer} that adds a workflow task to the tasks list
*/
public static FuncTaskConfigurer workflowTask(WorkflowConfigurer configurer) {
return subflow(configurer);
}

/**
* Create a {@link FuncTaskConfigurer} that adds a workflow subflow task.
*
* @param configurer configurer for the nested workflow task
* @return a {@link FuncTaskConfigurer} that adds a workflow task to the tasks list
* @deprecated use {@link #subflow(WorkflowConfigurer)} to avoid ambiguity with spec-side factory
* methods
*/
@Deprecated
Comment thread
matheusandre1 marked this conversation as resolved.
Comment thread
matheusandre1 marked this conversation as resolved.
public static FuncTaskConfigurer workflow(WorkflowConfigurer configurer) {
return subflow(configurer);
}
Comment thread
matheusandre1 marked this conversation as resolved.

/**
* Create a new {@link WorkflowSpec} to be used as a factory for workflow definitions.
*
* @param namespace workflow namespace
* @param name workflow name
* @param version workflow version
* @return a new {@link WorkflowSpec} instance
*/
public static WorkflowSpec workflow(String namespace, String name, String version) {
return DSL.workflow(namespace, name, version);
}

/**
* Create a new {@link WorkflowSpec} to be used as a factory for workflow definitions.
*
* @param namespace workflow namespace
* @param name workflow name
* @return a new {@link WorkflowSpec} instance
*/
public static WorkflowSpec workflow(String namespace, String name) {
return DSL.workflow(namespace, name);
}

/**
* Create a new {@link WorkflowSpec} to be used as a factory for workflow definitions.
*
* @return a new {@link WorkflowSpec} instance
*/
public static WorkflowSpec workflow() {
return DSL.workflow();
}

// ---------------------------------------------------------------------------
// HTTP / OpenAPI
// ---------------------------------------------------------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import io.serverlessworkflow.fluent.func.FuncSetTaskBuilder;
import io.serverlessworkflow.fluent.func.FuncSwitchTaskBuilder;
import io.serverlessworkflow.fluent.func.FuncTryTaskBuilder;
import io.serverlessworkflow.fluent.spec.WorkflowTaskBuilder;
import io.serverlessworkflow.fluent.spec.spi.CallHttpFluent;
import io.serverlessworkflow.fluent.spec.spi.CallOpenAPIFluent;
import io.serverlessworkflow.fluent.spec.spi.EmitFluent;
Expand All @@ -36,6 +37,8 @@
import io.serverlessworkflow.fluent.spec.spi.SetFluent;
import io.serverlessworkflow.fluent.spec.spi.SwitchFluent;
import io.serverlessworkflow.fluent.spec.spi.TryCatchFluent;
import io.serverlessworkflow.fluent.spec.spi.WorkflowFluent;
import java.util.function.Consumer;

public interface FuncDoFluent<SELF extends FuncDoFluent<SELF>>
extends SetFluent<FuncSetTaskBuilder, SELF>,
Expand All @@ -48,4 +51,14 @@ public interface FuncDoFluent<SELF extends FuncDoFluent<SELF>>
TryCatchFluent<FuncTryTaskBuilder, SELF>,
CallFnFluent<FuncCallTaskBuilder, SELF>,
CallHttpFluent<FuncCallHttpTaskBuilder, SELF>,
CallOpenAPIFluent<FuncCallOpenAPITaskBuilder, SELF> {}
CallOpenAPIFluent<FuncCallOpenAPITaskBuilder, SELF>,
WorkflowFluent<WorkflowTaskBuilder, SELF> {

default SELF subflow(String name, Consumer<WorkflowTaskBuilder> itemsConfigurer) {
return this.workflow(name, itemsConfigurer);
}

default SELF subflow(Consumer<WorkflowTaskBuilder> itemsConfigurer) {
return this.workflow(itemsConfigurer);
}
}
Loading
Loading