exsm v0.3.1 Exsm View Source

This is the main Exsm module.

It keeps most of the Exsm logics, it's the module that will be imported with use on the module responsible for the state machine.

Declare the states as an argument when importing Exsm on the module that will control your states transitions.

Exsm expects a Keyword as argument with two keys states and transitions.

Parameters

  • opts: A Keyword including states and transitions.

    • states: A List of Strings representing each state.
    • transitions: A Map for each state and it allowed next state(s).

Example

  defmodule YourProject.UserStateMachine do
    use Exsm,
      # The first state declared will be considered
      # the intial state
      states: ["created", "partial", "complete"],
      transitions: %{
        "created" =>  ["partial", "complete"],
        "partial" => "completed"
      }
  end

Link to this section Summary

Functions

Main macro function that will be executed upon the load of the module using it.

Triggers the transition of a struct to a new state, accordinly to a specific state machine module, if it passes any existing guard functions. It also runs any before or after callbacks and returns a tuple with {:ok, struct}, or {:error, "reason"}.

Link to this section Functions

Link to this macro

__using__(opts)

View Source (macro)

Main macro function that will be executed upon the load of the module using it.

It basically stores the states and transitions.

It expects a Keyword as argument with two keys states and transitions.

  • states: A List of Strings representing each state.
  • transitions: A Map for each state and it allowed next state(s).

P.S. The first state declared will be considered the intial state

Link to this function

transition_to(struct, state_machine_module, next_state)

View Source
transition_to(struct() | map(), module(), String.t()) ::
  {:ok, struct()} | {:error, String.t()}

Triggers the transition of a struct to a new state, accordinly to a specific state machine module, if it passes any existing guard functions. It also runs any before or after callbacks and returns a tuple with {:ok, struct}, or {:error, "reason"}.

Parameters

  • struct: The struct you want to transit to another state.
  • state_machine_module: The module that holds the state machine logic, where Exsm as imported.
  • next_state: String of the next state you want to transition to.

Examples

iex> Exsm.transition_to(%User{state: :partial}, UserStateMachine, :completed)
{:ok, %User{state: :completed}}
Link to this function

valid_transition?(struct, state_machine_module, next_state)

View Source
valid_transition?(struct() | map(), module(), String.t()) :: true | false

Returns true if transition is valid.

Parameters

  • struct: The struct you want to transit to another state.
  • state_machine_module: The module that holds the state machine logic, where Exsm as imported.
  • next_state: String of the next state you want to transition to.

Examples

iex> Exsm.valid_transition?(%User{state: :partial}, UserStateMachine, :completed)
true