lib/geocoder/request.ex

defmodule Geocoder.Request do
  @moduledoc """
  This is the actual request logic to abstract a client implementation and use supported clients specified
  for all providers in a uniform way.

  Common logic (retry, etc) to clients should be added here. Otherwise let the client implement their own specific
  needs
  """

  alias Geocoder.Request.HttpClient

  @spec request(HttpClient.request(), HttpClient.config()) ::
          {:ok, %{status_code: pos_integer, headers: any}}
          | {:ok, %{status_code: pos_integer, headers: any, body: binary}}
          | {:error, any}
  def request(request, config \\ []) do
    http_client = config[:http_client]

    http_client.request(
      request,
      config
    )
  end
end