Skip to content

Commit ebb589f

Browse files
committed
feat: add sub worflows run on FuncDSL
Signed-off-by: Matheus Andre <matheusandr2@gmail.com> Signed-off-by: Matheus André <matheusandr2@gmail.com>
1 parent 1d7838d commit ebb589f

6 files changed

Lines changed: 265 additions & 130 deletions

File tree

‎experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncDoTaskBuilder.java‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.serverlessworkflow.fluent.func.spi.FuncDoFluent;
2020
import io.serverlessworkflow.fluent.func.spi.FuncTaskTransformations;
2121
import io.serverlessworkflow.fluent.spec.BaseDoTaskBuilder;
22+
import io.serverlessworkflow.fluent.spec.WorkflowTaskBuilder;
2223
import java.util.function.Consumer;
2324

2425
public class FuncDoTaskBuilder extends BaseDoTaskBuilder<FuncDoTaskBuilder, FuncTaskItemListBuilder>
@@ -103,6 +104,24 @@ public FuncDoTaskBuilder openapi(
103104
return this;
104105
}
105106

107+
@Override
108+
public FuncDoTaskBuilder workflow(String name, Consumer<WorkflowTaskBuilder> itemsConfigurer) {
109+
this.listBuilder().workflow(name, itemsConfigurer);
110+
return this;
111+
}
112+
113+
@Override
114+
public FuncDoTaskBuilder subflow(String name, Consumer<WorkflowTaskBuilder> itemsConfigurer) {
115+
this.listBuilder().subflow(name, itemsConfigurer);
116+
return this;
117+
}
118+
119+
@Override
120+
public FuncDoTaskBuilder subflow(Consumer<WorkflowTaskBuilder> itemsConfigurer) {
121+
this.listBuilder().subflow(itemsConfigurer);
122+
return this;
123+
}
124+
106125
@Override
107126
public FuncDoTaskBuilder tryCatch(String name, Consumer<FuncTryTaskBuilder> itemsConfigurer) {
108127
this.listBuilder().tryCatch(name, itemsConfigurer);

‎experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/FuncTaskItemListBuilder.java‎

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import io.serverlessworkflow.api.types.TaskItem;
2323
import io.serverlessworkflow.fluent.func.spi.FuncDoFluent;
2424
import io.serverlessworkflow.fluent.spec.BaseTaskItemListBuilder;
25+
import io.serverlessworkflow.fluent.spec.TaskItemListBuilder;
26+
import io.serverlessworkflow.fluent.spec.WorkflowTaskBuilder;
2527
import java.util.List;
2628
import java.util.function.Consumer;
2729

@@ -165,6 +167,46 @@ public FuncTaskItemListBuilder openapi(
165167
return this.addTaskItem(new TaskItem(name, task));
166168
}
167169

170+
@Override
171+
public FuncTaskItemListBuilder workflow(
172+
String name, Consumer<WorkflowTaskBuilder> itemsConfigurer) {
173+
return this.addDelegatedWorkflow(name, itemsConfigurer, TYPE_WORKFLOW);
174+
}
175+
176+
@Override
177+
public FuncTaskItemListBuilder workflow(Consumer<WorkflowTaskBuilder> itemsConfigurer) {
178+
return this.workflow(null, itemsConfigurer);
179+
}
180+
181+
@Override
182+
public FuncTaskItemListBuilder subflow(
183+
String name, Consumer<WorkflowTaskBuilder> itemsConfigurer) {
184+
return this.addDelegatedWorkflow(name, itemsConfigurer, TYPE_WORKFLOW);
185+
}
186+
187+
@Override
188+
public FuncTaskItemListBuilder subflow(Consumer<WorkflowTaskBuilder> itemsConfigurer) {
189+
return this.subflow(null, itemsConfigurer);
190+
}
191+
192+
private FuncTaskItemListBuilder addDelegatedWorkflow(
193+
String name, Consumer<WorkflowTaskBuilder> itemsConfigurer, String delegateType) {
194+
name = this.defaultNameAndRequireConfig(name, itemsConfigurer, delegateType);
195+
// Preserve the original offset when delegating to avoid duplicate task names
196+
// across appended .tasks(...) blocks
197+
final int effectiveOffset = this.getOffset() + this.mutableList().size();
198+
final TaskItemListBuilder delegate = new TaskItemListBuilder(effectiveOffset);
199+
delegate.workflow(name, itemsConfigurer);
200+
final List<TaskItem> taskItems = delegate.build();
201+
if (taskItems.size() != 1) {
202+
throw new IllegalStateException(
203+
String.format(
204+
"Expected %s delegate '%s' to build exactly 1 TaskItem, but got %d",
205+
delegateType, name, taskItems.size()));
206+
}
207+
return addTaskItem(taskItems.get(0));
208+
}
209+
168210
@Override
169211
public FuncTaskItemListBuilder tryCatch(
170212
String name, Consumer<FuncTryTaskBuilder> itemsConfigurer) {

‎experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/dsl/FuncDSL.java‎

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,12 @@
4040
import io.serverlessworkflow.fluent.spec.EventFilterBuilder;
4141
import io.serverlessworkflow.fluent.spec.ScheduleBuilder;
4242
import io.serverlessworkflow.fluent.spec.TimeoutBuilder;
43+
import io.serverlessworkflow.fluent.spec.WorkflowTaskBuilder;
4344
import io.serverlessworkflow.fluent.spec.configurers.AuthenticationConfigurer;
45+
import io.serverlessworkflow.fluent.spec.configurers.WorkflowConfigurer;
4446
import io.serverlessworkflow.fluent.spec.dsl.DSL;
4547
import io.serverlessworkflow.fluent.spec.dsl.UseSpec;
48+
import io.serverlessworkflow.fluent.spec.dsl.WorkflowSpec;
4649
import io.serverlessworkflow.impl.TaskContextData;
4750
import io.serverlessworkflow.impl.WorkflowContextData;
4851
import java.net.URI;
@@ -1116,6 +1119,107 @@ public static FuncTaskConfigurer set(Map<String, Object> map) {
11161119
return list -> list.set(s -> s.expr(map));
11171120
}
11181121

1122+
/**
1123+
* Create a {@link FuncTaskConfigurer} that adds a sub-workflow call task using a {@link
1124+
* WorkflowConfigurer}.
1125+
*
1126+
* <pre>{@code
1127+
* tasks(
1128+
* subflow(
1129+
* workflow("org.acme", "sub-workflow", "0.1.0")
1130+
* .input("id", 99)
1131+
* .await(false)
1132+
* )
1133+
* );
1134+
* }</pre>
1135+
*
1136+
* @param configurer nested workflow configurer
1137+
* @return a {@link FuncTaskConfigurer} that adds a workflow task to the tasks list
1138+
*/
1139+
public static FuncTaskConfigurer subflow(WorkflowConfigurer configurer) {
1140+
Objects.requireNonNull(configurer, "configurer");
1141+
return list -> list.subflow(configurer);
1142+
}
1143+
1144+
/**
1145+
* Create a {@link FuncTaskConfigurer} that adds a named sub-workflow call task.
1146+
*
1147+
* @param name task name
1148+
* @param configurer nested workflow configurer
1149+
* @return a {@link FuncTaskConfigurer} that adds a workflow task to the tasks list
1150+
*/
1151+
public static FuncTaskConfigurer subflow(String name, Consumer<WorkflowTaskBuilder> configurer) {
1152+
Objects.requireNonNull(name, "name");
1153+
Objects.requireNonNull(configurer, "configurer");
1154+
return list -> list.subflow(name, configurer);
1155+
}
1156+
1157+
/**
1158+
* Create a {@link FuncTaskConfigurer} that adds an unnamed sub-workflow call task.
1159+
*
1160+
* @param configurer nested workflow configurer
1161+
* @return a {@link FuncTaskConfigurer} that adds a workflow task to the tasks list
1162+
*/
1163+
public static FuncTaskConfigurer subflow(Consumer<WorkflowTaskBuilder> configurer) {
1164+
Objects.requireNonNull(configurer, "configurer");
1165+
return list -> list.subflow(configurer);
1166+
}
1167+
1168+
/**
1169+
* Alias for {@link #subflow(WorkflowConfigurer)}.
1170+
*
1171+
* @param configurer nested workflow configurer
1172+
* @return a {@link FuncTaskConfigurer} that adds a workflow task to the tasks list
1173+
*/
1174+
public static FuncTaskConfigurer workflowTask(WorkflowConfigurer configurer) {
1175+
return subflow(configurer);
1176+
}
1177+
1178+
/**
1179+
* Create a {@link FuncTaskConfigurer} that adds a workflow subflow task.
1180+
*
1181+
* @param configurer configurer for the nested workflow task
1182+
* @return a {@link FuncTaskConfigurer} that adds a workflow task to the tasks list
1183+
* @deprecated use {@link #subflow(WorkflowConfigurer)} to avoid ambiguity with spec-side factory
1184+
* methods
1185+
*/
1186+
@Deprecated
1187+
public static FuncTaskConfigurer workflow(WorkflowConfigurer configurer) {
1188+
return subflow(configurer);
1189+
}
1190+
1191+
/**
1192+
* Create a new {@link WorkflowSpec} to be used as a factory for workflow definitions.
1193+
*
1194+
* @param namespace workflow namespace
1195+
* @param name workflow name
1196+
* @param version workflow version
1197+
* @return a new {@link WorkflowSpec} instance
1198+
*/
1199+
public static WorkflowSpec workflow(String namespace, String name, String version) {
1200+
return DSL.workflow(namespace, name, version);
1201+
}
1202+
1203+
/**
1204+
* Create a new {@link WorkflowSpec} to be used as a factory for workflow definitions.
1205+
*
1206+
* @param namespace workflow namespace
1207+
* @param name workflow name
1208+
* @return a new {@link WorkflowSpec} instance
1209+
*/
1210+
public static WorkflowSpec workflow(String namespace, String name) {
1211+
return DSL.workflow(namespace, name);
1212+
}
1213+
1214+
/**
1215+
* Create a new {@link WorkflowSpec} to be used as a factory for workflow definitions.
1216+
*
1217+
* @return a new {@link WorkflowSpec} instance
1218+
*/
1219+
public static WorkflowSpec workflow() {
1220+
return DSL.workflow();
1221+
}
1222+
11191223
// ---------------------------------------------------------------------------
11201224
// HTTP / OpenAPI
11211225
// ---------------------------------------------------------------------------

‎experimental/fluent/func/src/main/java/io/serverlessworkflow/fluent/func/spi/FuncDoFluent.java‎

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import io.serverlessworkflow.fluent.func.FuncSetTaskBuilder;
2727
import io.serverlessworkflow.fluent.func.FuncSwitchTaskBuilder;
2828
import io.serverlessworkflow.fluent.func.FuncTryTaskBuilder;
29+
import io.serverlessworkflow.fluent.spec.WorkflowTaskBuilder;
2930
import io.serverlessworkflow.fluent.spec.spi.CallHttpFluent;
3031
import io.serverlessworkflow.fluent.spec.spi.CallOpenAPIFluent;
3132
import io.serverlessworkflow.fluent.spec.spi.EmitFluent;
@@ -36,6 +37,8 @@
3637
import io.serverlessworkflow.fluent.spec.spi.SetFluent;
3738
import io.serverlessworkflow.fluent.spec.spi.SwitchFluent;
3839
import io.serverlessworkflow.fluent.spec.spi.TryCatchFluent;
40+
import io.serverlessworkflow.fluent.spec.spi.WorkflowFluent;
41+
import java.util.function.Consumer;
3942

4043
public interface FuncDoFluent<SELF extends FuncDoFluent<SELF>>
4144
extends SetFluent<FuncSetTaskBuilder, SELF>,
@@ -48,4 +51,14 @@ public interface FuncDoFluent<SELF extends FuncDoFluent<SELF>>
4851
TryCatchFluent<FuncTryTaskBuilder, SELF>,
4952
CallFnFluent<FuncCallTaskBuilder, SELF>,
5053
CallHttpFluent<FuncCallHttpTaskBuilder, SELF>,
51-
CallOpenAPIFluent<FuncCallOpenAPITaskBuilder, SELF> {}
54+
CallOpenAPIFluent<FuncCallOpenAPITaskBuilder, SELF>,
55+
WorkflowFluent<WorkflowTaskBuilder, SELF> {
56+
57+
default SELF subflow(String name, Consumer<WorkflowTaskBuilder> itemsConfigurer) {
58+
return this.workflow(name, itemsConfigurer);
59+
}
60+
61+
default SELF subflow(Consumer<WorkflowTaskBuilder> itemsConfigurer) {
62+
return this.workflow(itemsConfigurer);
63+
}
64+
}

0 commit comments

Comments
 (0)