lib/finitomata/errors.ex

defmodule Finitomata.TestTransitionError do
  defexception path: nil, transition: [], missing_states: [], unknown_states: [], message: nil

  @impl true
  def message(%{message: nil} = exception) do
    [
      "The transition validation must include all possible continuations.",
      if(not Enum.empty?(exception.transition),
        do: "  Transition: " <> inspect(exception.transition) <> "."
      ),
      if(not Enum.empty?(exception.missing_states),
        do: "  Missing states: " <> inspect(exception.missing_states) <> "."
      ),
      if(not Enum.empty?(exception.unknown_states),
        do: "  Unknown states: " <> inspect(exception.unknown_states) <> "."
      )
    ]
    |> Enum.reject(&is_nil/1)
    |> Enum.join("\n")
  end

  def message(%{message: message}) do
    message
  end

  @impl true
  def blame(exception, stacktrace) do
    message = message(exception) <> hint()
    {%{exception | message: message}, stacktrace}
  end

  defp hint do
    "\nIf you do not want to validate anything after entering some states, use " <>
      "`:state -> :ok` clause.\n"
  end
end