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