Skip to main content

lib/jido/chat/adapter_registry.ex

defmodule Jido.Chat.AdapterRegistry do
  @moduledoc false

  @spec normalize_adapters(map() | term()) :: map()
  def normalize_adapters(adapters) when is_map(adapters), do: adapters
  def normalize_adapters(_), do: %{}

  @spec resolve(map(), atom()) :: {:ok, module()} | {:error, {:unknown_adapter, atom()}}
  def resolve(chat, adapter_name) when is_map(chat) and is_atom(adapter_name) do
    adapters = Map.get(chat, :adapters, %{})

    case Map.fetch(adapters, adapter_name) do
      {:ok, adapter_module} -> {:ok, adapter_module}
      :error -> {:error, {:unknown_adapter, adapter_name}}
    end
  end

  @spec resolve!(map(), atom()) :: module()
  def resolve!(chat, adapter_name) when is_map(chat) and is_atom(adapter_name) do
    case resolve(chat, adapter_name) do
      {:ok, adapter_module} ->
        adapter_module

      {:error, {:unknown_adapter, _}} ->
        raise ArgumentError,
              "unknown adapter #{inspect(adapter_name)}; configure it in chat.adapters"
    end
  end
end