Skip to content

Commit f4a2561

Browse files
committed
foreach state with the transition to itself
Signed-off-by: Pedro Escaleira <pedroescaleira@hotmail.com>
1 parent af4ea3c commit f4a2561

File tree

1 file changed

+99
-83
lines changed

1 file changed

+99
-83
lines changed

serverlessworkflow/sdk/state_machine_generator.py

Lines changed: 99 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,11 @@ def event_state_details(self):
265265
def foreach_state_details(self):
266266
if isinstance(self.current_state, ForEachState):
267267
self.state_to_machine_state(["foreach_state", "state"])
268+
self.state_machine.add_transition(
269+
trigger=f"{self.current_state.iterationParam} IN {self.current_state.inputCollection}",
270+
source=self.current_state.name,
271+
dest=self.current_state.name,
272+
)
268273
self.generate_actions_info(
269274
machine_state=self.state_machine.get_state(self.current_state.name),
270275
state_name=self.current_state.name,
@@ -349,93 +354,104 @@ def generate_actions_info(
349354
actions: List[Dict[str, Action]],
350355
action_mode: str = "sequential",
351356
):
352-
parallel_states = []
353-
if actions:
354-
new_subflows_names = self.get_subflow_state(
355-
machine_state=machine_state, state_name=state_name, actions=actions
356-
)
357-
for i, action in enumerate(actions):
358-
name = None
359-
if action.functionRef:
360-
name = (
361-
self.get_function_name(action.functionRef)
362-
if isinstance(action.functionRef, str)
363-
else (
364-
action.functionRef.refName
365-
if isinstance(action.functionRef, FunctionRef)
366-
else None
367-
)
368-
)
369-
if name not in machine_state.states.keys():
370-
machine_state.add_substate(
371-
ns := self.state_machine.state_cls(name)
372-
)
373-
ns.tags = ["function"]
374-
self.get_action_function(state=ns, f_name=name)
375-
elif action.subFlowRef:
376-
name = new_subflows_names.get(i)
377-
elif action.eventRef:
378-
name = f"{action.eventRef.triggerEventRef}/{action.eventRef.resultEventRef}"
379-
if name not in machine_state.states.keys():
380-
machine_state.add_substate(
381-
ns := self.state_machine.state_cls(name)
357+
if self.get_actions:
358+
parallel_states = []
359+
if actions:
360+
new_subflows_names = self.get_subflow_state(
361+
machine_state=machine_state, state_name=state_name, actions=actions
362+
)
363+
for i, action in enumerate(actions):
364+
name = None
365+
if action.functionRef:
366+
name = (
367+
self.get_function_name(action.functionRef)
368+
if isinstance(action.functionRef, str)
369+
else (
370+
action.functionRef.refName
371+
if isinstance(action.functionRef, FunctionRef)
372+
else None
373+
)
382374
)
383-
ns.tags = ["event"]
384-
self.get_action_event(state=ns, e_name=name)
385-
if name:
386-
if action_mode == "sequential":
387-
if i < len(actions) - 1:
388-
# get next name
389-
next_name = None
390-
if actions[i + 1].functionRef:
391-
next_name = (
392-
self.get_function_name(actions[i + 1].functionRef)
393-
if isinstance(actions[i + 1].functionRef, str)
394-
else (
395-
actions[i + 1].functionRef.refName
396-
if isinstance(
397-
actions[i + 1].functionRef, FunctionRef
375+
if name not in machine_state.states.keys():
376+
machine_state.add_substate(
377+
ns := self.state_machine.state_cls(name)
378+
)
379+
ns.tags = ["function"]
380+
self.get_action_function(state=ns, f_name=name)
381+
elif action.subFlowRef:
382+
name = new_subflows_names.get(i)
383+
elif action.eventRef:
384+
name = f"{action.eventRef.triggerEventRef}/{action.eventRef.resultEventRef}"
385+
if name not in machine_state.states.keys():
386+
machine_state.add_substate(
387+
ns := self.state_machine.state_cls(name)
388+
)
389+
ns.tags = ["event"]
390+
self.get_action_event(state=ns, e_name=name)
391+
if name:
392+
if action_mode == "sequential":
393+
if i < len(actions) - 1:
394+
# get next name
395+
next_name = None
396+
if actions[i + 1].functionRef:
397+
next_name = (
398+
self.get_function_name(
399+
actions[i + 1].functionRef
400+
)
401+
if isinstance(actions[i + 1].functionRef, str)
402+
else (
403+
actions[i + 1].functionRef.refName
404+
if isinstance(
405+
actions[i + 1].functionRef, FunctionRef
406+
)
407+
else None
398408
)
399-
else None
400409
)
410+
if (
411+
next_name
412+
not in self.state_machine.get_state(
413+
state_name
414+
).states.keys()
415+
):
416+
machine_state.add_substate(
417+
ns := self.state_machine.state_cls(
418+
next_name
419+
)
420+
)
421+
ns.tags = ["function"]
422+
self.get_action_function(
423+
state=ns, f_name=next_name
424+
)
425+
elif actions[i + 1].subFlowRef:
426+
next_name = new_subflows_names.get(i + 1)
427+
elif actions[i + 1].eventRef:
428+
next_name = f"{action.eventRef.triggerEventRef}/{action.eventRef.resultEventRef}"
429+
if (
430+
next_name
431+
not in self.state_machine.get_state(
432+
state_name
433+
).states.keys()
434+
):
435+
machine_state.add_substate(
436+
ns := self.state_machine.state_cls(
437+
next_name
438+
)
439+
)
440+
ns.tags = ["event"]
441+
self.get_action_event(
442+
state=ns, e_name=next_name
443+
)
444+
self.state_machine.add_transition(
445+
trigger="",
446+
source=f"{state_name}.{name}",
447+
dest=f"{state_name}.{next_name}",
401448
)
402-
if (
403-
next_name
404-
not in self.state_machine.get_state(
405-
state_name
406-
).states.keys()
407-
):
408-
machine_state.add_substate(
409-
ns := self.state_machine.state_cls(next_name)
410-
)
411-
ns.tags = ["function"]
412-
self.get_action_function(state=ns, f_name=next_name)
413-
elif actions[i + 1].subFlowRef:
414-
next_name = new_subflows_names.get(i + 1)
415-
elif actions[i + 1].eventRef:
416-
next_name = f"{action.eventRef.triggerEventRef}/{action.eventRef.resultEventRef}"
417-
if (
418-
next_name
419-
not in self.state_machine.get_state(
420-
state_name
421-
).states.keys()
422-
):
423-
machine_state.add_substate(
424-
ns := self.state_machine.state_cls(next_name)
425-
)
426-
ns.tags = ["event"]
427-
self.get_action_event(state=ns, e_name=next_name)
428-
self.state_machine.add_transition(
429-
trigger="",
430-
source=f"{state_name}.{name}",
431-
dest=f"{state_name}.{next_name}",
432-
)
433-
if i == 0:
434-
machine_state.initial = name
435-
elif action_mode == "parallel":
436-
parallel_states.append(name)
437-
if action_mode == "parallel":
438-
machine_state.initial = parallel_states
449+
if i == 0:
450+
machine_state.initial = name
451+
elif action_mode == "parallel":
452+
parallel_states.append(name)
453+
if action_mode == "parallel":
454+
machine_state.initial = parallel_states
439455

440456
def get_action_function(self, state: NestedState, f_name: str):
441457
if self.workflow.functions:

0 commit comments

Comments
 (0)