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