ash_state_machine/lib/transformers/fill_in_event_defaults.ex

55 lines
1.4 KiB
Elixir
Raw Normal View History

defmodule AshStateMachine.Transformers.FillInTransitionDefaults do
@moduledoc false
2023-04-22 05:43:36 +12:00
use Spark.Dsl.Transformer
alias Spark.Dsl.Transformer
def transform(dsl_state) do
2023-04-23 12:39:29 +12:00
initial_states = AshStateMachine.Info.state_machine_initial_states!(dsl_state)
2023-04-22 05:43:36 +12:00
transitions =
2023-04-22 05:43:36 +12:00
dsl_state
|> AshStateMachine.Info.state_machine_transitions()
2023-04-22 05:43:36 +12:00
all_states =
transitions
|> Enum.flat_map(fn transition ->
List.wrap(transition.from) ++ List.wrap(transition.to)
2023-04-22 05:43:36 +12:00
end)
|> Enum.concat(List.wrap(initial_states))
|> Enum.concat(List.wrap(AshStateMachine.Info.state_machine_extra_states!(dsl_state)))
2023-04-22 07:25:39 +12:00
|> Enum.uniq()
|> Enum.reject(&(&1 == :*))
2023-04-22 05:43:36 +12:00
dsl_state =
2023-04-23 12:39:29 +12:00
Transformer.set_option(
dsl_state,
[:state_machine],
:initial_states,
List.wrap(initial_states)
)
2023-04-22 05:43:36 +12:00
2023-08-05 09:47:42 +12:00
{:ok,
transitions
|> Enum.reduce(dsl_state, fn transition, dsl_state ->
Transformer.replace_entity(dsl_state, [:state_machine, :transitions], %{
2023-08-05 09:47:42 +12:00
transition
| from: replace_star(transition.from, all_states),
to: replace_star(transition.to, all_states)
})
end)
|> Transformer.persist(:all_state_machine_states, all_states)}
end
defp replace_star(states, all_states) do
states
|> List.wrap()
|> Enum.flat_map(fn
:* ->
all_states
other ->
List.wrap(other)
end)
2023-04-22 05:43:36 +12:00
end
end