Packages
finitomata
0.32.0
0.41.0
0.40.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.1
0.30.3
0.30.2
0.30.1
0.30.0
0.29.10
0.29.9
0.29.8
0.29.7
0.29.6
0.29.5
0.29.4
0.29.3
0.29.2
0.29.1
0.29.0
0.28.1
0.28.0
0.27.1
0.27.0
0.26.4
0.26.3
0.26.2
0.26.1
0.26.0
0.25.0
0.24.4
0.24.3
0.24.2
0.24.1
0.24.0
0.23.7
0.23.6
0.23.5
0.23.4
0.23.3
0.23.2
0.23.1
0.23.0
0.22.1
0.22.0
0.21.4
0.21.3
0.21.2
0.21.1
0.21.0
0.20.2
0.20.1
0.20.0
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.1
0.17.0
0.16.0
0.15.1
0.15.0
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.1
0.12.0
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.0
0.3.0
0.2.0
0.1.1
0.1.0
The FSM implementation generated from PlantUML textual representation.
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/fsm_template.eex
defmodule <%= inspect(@module) %> do
@moduledoc """
`Finitomata`-based implementation of …
"""
@fsm """
<%= String.trim(@fsm) %>
"""
<%= @use_clause %>
# State
@type t :: %{
__struct__: __MODULE__,
name: Finitomata.fsm_name()
}
defstruct name: nil
# Interface
@doc """
Starts an FSM under `Finitomata`-driven supervision tree.
If `UUID` is available and `name` is not passed (is `nil`,)
the name will be generated.
"""
@spec start_fsm(Finitomata.id(), Finitomata.fsm_name()) ::
DynamicSupervisor.on_start_child()
def start_fsm(id \\ nil, name \\ nil)
case Code.ensure_compiled(UUID) do
{:module, UUID} ->
def start_fsm(id, nil),
do: start_fsm(id, UUID.uuid4())
{:error, _} ->
def start_fsm(id, nil),
do: raise("add `uuid` to deps to use `nil` as a name")
end
def start_fsm(id, name) when not is_nil(name) do
with {:ok, pid} <- Finitomata.start_fsm(id, name, __MODULE__, %__MODULE__{name: name}),
do: {:ok, pid, name}
end
# Implementation
@impl Finitomata
<%= for %Finitomata.Transition{from: from, to: to, event: event} <- @transitions, from != :* do %>
<%= if to != :* or not @auto_terminate? do %>
def on_transition(:<%= from %>, :<%= event %>, _event_payload, state) do
{:ok, :<%= to %>, state}
end
<% end %>
<% end %>
<%= if @timer? do %>
@impl Finitomata
def on_timer(_fsm_state, state) do
{:ok, state}
end
<% end %>
<%= if :on_enter in @to_implement do %>
@impl Finitomata
def on_enter(_fsm_state, _state) do
:ok
end
<% end %>
<%= if :on_exit in @to_implement do %>
@impl Finitomata
def on_exit(_fsm_state, _state) do
:ok
end
<% end %>
<%= if :on_failure in @to_implement do %>
@impl Finitomata
def on_failure(_event, _event_payload, _state) do
:ok
end
<% end %>
<%= if :on_terminate in @to_implement do %>
@impl Finitomata
def on_terminate(_state) do
:ok
end
<% end %>
end