Skip to main content

lib/access_grid/http_client.ex

defmodule AccessGrid.HttpClient do
  @moduledoc """
  HTTP client dispatcher.

  Delegates to the configured HTTP client implementation (default: `AccessGrid.HttpClient.Req`).
  The implementation can be configured via application config or overridden per-process
  using Gestalt for testing.
  """

  alias AccessGrid.HttpFailure
  alias AccessGrid.HttpResponse

  @doc """
  Performs an HTTP DELETE request.
  """
  @spec delete(String.t(), map()) :: {:ok, HttpResponse.t()} | {:error, HttpFailure.t()}
  def delete(url, opts \\ %{}), do: client().delete(url, opts)

  @doc """
  Performs an HTTP GET request.
  """
  @spec get(String.t(), map()) :: {:ok, HttpResponse.t()} | {:error, HttpFailure.t()}
  def get(url, opts \\ %{}), do: client().get(url, opts)

  @doc """
  Performs an HTTP HEAD request.
  """
  @spec head(String.t(), map()) :: {:ok, HttpResponse.t()} | {:error, HttpFailure.t()}
  def head(url, opts \\ %{}), do: client().head(url, opts)

  @doc """
  Performs an HTTP PATCH request.
  """
  @spec patch(String.t(), map()) :: {:ok, HttpResponse.t()} | {:error, HttpFailure.t()}
  def patch(url, opts \\ %{}), do: client().patch(url, opts)

  @doc """
  Performs an HTTP POST request.
  """
  @spec post(String.t(), map()) :: {:ok, HttpResponse.t()} | {:error, HttpFailure.t()}
  def post(url, opts \\ %{}), do: client().post(url, opts)

  @doc """
  Performs an HTTP PUT request.
  """
  @spec put(String.t(), map()) :: {:ok, HttpResponse.t()} | {:error, HttpFailure.t()}
  def put(url, opts \\ %{}), do: client().put(url, opts)

  defp client do
    Gestalt.get_config(:accessgrid, :http_client, self())
  end
end