defmodule AccessGrid.HttpClient.Behaviour do
@moduledoc """
Behaviour for HTTP clients.
Implementations must normalize responses to `AccessGrid.HttpResponse` and
errors to `AccessGrid.HttpFailure`.
"""
alias AccessGrid.HttpFailure
alias AccessGrid.HttpResponse
@type url :: String.t()
@type request_opts :: %{
optional(:headers) => [{String.t(), String.t()}],
optional(:params) => %{optional(String.t()) => String.t()},
optional(:timeout) => integer(),
optional(:body) => term()
}
@doc """
Performs an HTTP DELETE request.
"""
@callback delete(url(), request_opts()) :: {:ok, HttpResponse.t()} | {:error, HttpFailure.t()}
@doc """
Performs an HTTP GET request.
"""
@callback get(url(), request_opts()) :: {:ok, HttpResponse.t()} | {:error, HttpFailure.t()}
@doc """
Performs an HTTP HEAD request.
"""
@callback head(url(), request_opts()) :: {:ok, HttpResponse.t()} | {:error, HttpFailure.t()}
@doc """
Performs an HTTP PATCH request.
"""
@callback patch(url(), request_opts()) :: {:ok, HttpResponse.t()} | {:error, HttpFailure.t()}
@doc """
Performs an HTTP POST request.
"""
@callback post(url(), request_opts()) :: {:ok, HttpResponse.t()} | {:error, HttpFailure.t()}
@doc """
Performs an HTTP PUT request.
"""
@callback put(url(), request_opts()) :: {:ok, HttpResponse.t()} | {:error, HttpFailure.t()}
end