lib/kraken/routes.ex

defmodule Kraken.Routes do
  alias Kraken.Define.RoutingTable

  @spec define(String.t()) :: {:ok, Kraken.RoutingTable} | {:error, any()}
  def define(definition) when is_binary(definition) do
    definition
    |> Jason.decode!()
    |> define()
  end

  @spec define(map()) :: {:ok, Kraken.RoutingTable} | {:error, any()}
  def define(definition) when is_map(definition) do
    RoutingTable.define(definition)
  end

  @spec all() :: {:ok, map()} | {:error, any()}
  def all() do
    {:ok, apply(Kraken.RoutingTable, :routes, [])}
  rescue
    UndefinedFunctionError ->
      {:error, :no_routes}
  end

  @spec delete() :: :ok
  def delete() do
    :code.soft_purge(Kraken.RoutingTable)
    :code.delete(Kraken.RoutingTable)
    :ok
  end
end