Skip to main content

lib/beam_weaver/tool_kit.ex

defmodule BeamWeaver.ToolKit do
  @moduledoc """
  Behaviour for modules that expose a collection of tools.
  """

  alias BeamWeaver.Core.Error

  @callback tools(keyword()) :: [term()] | {:ok, [term()]} | {:error, Error.t()}

  @doc """
  Loads tools from a toolkit module or struct.
  """
  @spec tools(module() | struct(), keyword()) :: {:ok, [term()]} | {:error, Error.t()}
  def tools(toolkit, opts \\ [])

  def tools(module, opts) when is_atom(module) do
    normalize_result(module.tools(opts))
  end

  def tools(%module{} = toolkit, opts) do
    normalize_result(module.tools(toolkit, opts))
  end

  defp normalize_result({:ok, tools}) when is_list(tools), do: {:ok, tools}
  defp normalize_result({:error, %Error{}} = error), do: error
  defp normalize_result(tools) when is_list(tools), do: {:ok, tools}
end