lib/adapters/append_items.ex

defmodule Iris.Adapters.AppendItems do
  defguard is_valid_input(token, list, module, key)
           when is_list(list) and is_atom(module) and is_atom(key) and is_binary(token)

  def from_list(token, list, module, key) when is_valid_input(token, list, module, key) do
    ids = Enum.map(list, &Map.get(&1, key))

    with {:ok, items} <- module.all(token, ids) do
      key_without_sufix =
        String.slice(Atom.to_string(key), 0..-4)
        |> String.to_atom()

      {:ok,
       for item <- items, entry <- list do
         Map.put(entry, key_without_sufix, item)
         |> Map.delete(key)
       end}
    end
  end

  def from_list!(token, list, module, key) when is_valid_input(token, list, module, key) do
    ids = Enum.map(list, &Map.get(&1, key))

    items = module.all!(token, ids)

    key_without_sufix =
      String.slice(Atom.to_string(key), 0..-4)
      |> String.to_atom()

    for item <- items, entry <- list do
      Map.put(entry, key_without_sufix, item)
      |> Map.delete(key)
    end
  end
end