ash_state_machine/lib/transformers/fill_in_event_defaults.ex

61 lines
1.6 KiB
Elixir
Raw Normal View History

defmodule AshStateMachine.Transformers.FillInTransitionDefaults do
2023-04-22 05:43:36 +12:00
use Spark.Dsl.Transformer
alias Spark.Dsl.Transformer
@moduledoc false
def transform(dsl_state) do
2023-04-22 07:25:39 +12:00
initial_states =
case AshStateMachine.Info.state_machine_initial_states(dsl_state) do
2023-04-22 07:25:39 +12:00
{:ok, value} -> List.wrap(value)
_ -> []
end
initial_states =
case initial_states do
[] ->
case AshStateMachine.Info.state_machine_default_initial_state(dsl_state) do
2023-04-22 07:25:39 +12:00
{:ok, value} when not is_nil(value) ->
[value]
_ ->
initial_states
end
_ ->
initial_states
end
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))
2023-04-22 07:25:39 +12:00
|> Enum.uniq()
2023-04-22 05:43:36 +12:00
dsl_state =
case AshStateMachine.Info.state_machine_initial_states(dsl_state) do
2023-04-22 05:43:36 +12:00
{:ok, value} when not is_nil(value) and value != [] ->
dsl_state
_ ->
Transformer.set_option(dsl_state, [:state_machine], :initial_states, all_states)
2023-04-22 05:43:36 +12:00
end
2023-04-22 07:25:39 +12:00
{:ok,
transitions
|> Enum.reduce(dsl_state, fn transition, dsl_state ->
Transformer.replace_entity(dsl_state, [:state_machine], %{
transition
| from: transition.from || all_states,
to: transition.to || all_states
2023-04-22 07:25:39 +12:00
})
end)
|> Transformer.persist(:all_state_machine_states, all_states)}
2023-04-22 05:43:36 +12:00
end
end