Skip to content

Commit 6a80846

Browse files
committed
event state now has all the information regarding its events and states
Signed-off-by: Pedro Escaleira <[email protected]>
1 parent a68335d commit 6a80846

File tree

2 files changed

+80
-4
lines changed

2 files changed

+80
-4
lines changed

serverlessworkflow/sdk/on_events.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def __init__(self,
1919
**kwargs):
2020

2121
_default_values = {'actionMode': 'sequential'}
22-
SwfBase.__init__(self, locals(), kwargs, SwfBase.default_hydration, _default_values)
22+
SwfBase.__init__(self, locals(), kwargs, OnEvents.f_hydration, _default_values)
2323

2424
@staticmethod
2525
def f_hydration(p_key, p_value):

serverlessworkflow/sdk/state_machine_generator.py

Lines changed: 79 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,67 @@ def sleep_state_details(self):
259259

260260
def event_state_details(self):
261261
if isinstance(self.current_state, EventState):
262-
self.state_to_machine_state(["event_state", "state"])
262+
state = self.state_to_machine_state(["event_state", "state"])
263+
if self.get_actions:
264+
if on_events := self.current_state.onEvents:
265+
state.initial = [] if len(on_events) > 1 else on_events[0]
266+
for i, oe in enumerate(on_events):
267+
state.add_substate(
268+
oe_state := self.state_machine.state_cls(
269+
oe_name := f"onEvent {i}"
270+
)
271+
)
272+
273+
# define initial state
274+
if i == 0 and len(on_events) > 1:
275+
state.initial = [oe_state.name]
276+
elif i == 0 and len(on_events) == 1:
277+
state.initial = oe_state.name
278+
else:
279+
state.initial.append(oe_state.name)
280+
281+
event_names = []
282+
for ie, event in enumerate(oe.eventRefs):
283+
oe_state.add_substate(
284+
ns := self.state_machine.state_cls(event)
285+
)
286+
ns.tags = ["event"]
287+
self.get_action_event(state=ns, e_name=event)
288+
event_names.append(event)
289+
290+
# define initial state
291+
if ie == 0 and len(oe.eventRefs) > 1:
292+
oe_state.initial = [event]
293+
elif ie == 0 and len(oe.eventRefs) == 1:
294+
oe_state.initial = event
295+
else:
296+
oe_state.initial.append(event)
297+
298+
if self.current_state.exclusive:
299+
oe_state.add_substate(
300+
ns := self.state_machine.state_cls(
301+
action_name := f"action {ie}"
302+
)
303+
)
304+
self.state_machine.add_transition(
305+
trigger="",
306+
source=f"{self.current_state.name}.{oe_name}.{event}",
307+
dest=f"{self.current_state.name}.{oe_name}.{action_name}",
308+
)
309+
self.generate_actions_info(
310+
machine_state=ns,
311+
state_name=f"{self.current_state.name}.{oe_name}.{action_name}",
312+
actions=oe.actions,
313+
action_mode=oe.actionMode,
314+
)
315+
if not self.current_state.exclusive and oe.actions:
316+
self.generate_actions_info(
317+
machine_state=oe_state,
318+
state_name=f"{self.current_state.name}.{oe_name}",
319+
actions=oe.actions,
320+
action_mode=oe.actionMode,
321+
initial_states=event_names,
322+
)
263323

264324
def foreach_state_details(self):
265325
if isinstance(self.current_state, ForEachState):
@@ -352,6 +412,7 @@ def generate_actions_info(
352412
state_name: str,
353413
actions: List[Dict[str, Action]],
354414
action_mode: str = "sequential",
415+
initial_states: List[str] = [],
355416
):
356417
if self.get_actions:
357418
parallel_states = []
@@ -445,12 +506,27 @@ def generate_actions_info(
445506
source=f"{state_name}.{name}",
446507
dest=f"{state_name}.{next_name}",
447508
)
448-
if i == 0:
509+
if i == 0 and not initial_states:
449510
machine_state.initial = name
511+
elif i == 0 and initial_states:
512+
for init_s in initial_states:
513+
self.state_machine.add_transition(
514+
trigger="",
515+
source=f"{state_name}.{init_s}",
516+
dest=f"{state_name}.{name}",
517+
)
450518
elif action_mode == "parallel":
451519
parallel_states.append(name)
452-
if action_mode == "parallel":
520+
if action_mode == "parallel" and not initial_states:
453521
machine_state.initial = parallel_states
522+
elif action_mode == "parallel" and initial_states:
523+
for init_s in initial_states:
524+
for ps in parallel_states:
525+
self.state_machine.add_transition(
526+
trigger="",
527+
source=f"{state_name}.{init_s}",
528+
dest=f"{state_name}.{ps}",
529+
)
454530

455531
def get_action_function(self, state: NestedState, f_name: str):
456532
if self.workflow.functions:

0 commit comments

Comments
 (0)