lib/actors/node/adapters/erqwest_adapter.ex

defmodule Actors.Node.Adapters.ErqwestAdapter do
  @moduledoc """
  Tesla adapter using erqwest http client library
  """
  @behaviour Tesla.Adapter

  @impl Tesla.Adapter
  def call(%Tesla.Env{} = env, opts) do
    name = Keyword.fetch!(opts, :name)
    opts = Tesla.Adapter.opts(env, opts)
    url = Tesla.build_url(env.url, env.query)

    case request(name, env.method, url, env.headers, env.body, opts) do
      {:ok, %{status: status, body: body, headers: headers}} ->
        {:ok, %Tesla.Env{env | status: status, headers: headers, body: body}}

      error ->
        {:error, Exception.message(error)}
    end
  end

  defp request(name, method, url, headers, body, _opts) do
    case method do
      :post ->
        :erqwest.post(name, url, %{body: body, headers: headers})

      _ ->
        raise ArgumentError, "Method not supported #{inspect(method)}"
    end
  end
end