defmodule BinanceHttp.Http.Client do @doc """ Abstraction for integrate http client """ @callback request(method :: binary, url :: binary, body :: term, headers :: list, opts :: list) :: {:ok, status :: non_neg_integer, headers :: list | map, body :: nil | binary} | {:error, term} def request(method, url, body, headers, opts) do case impl().request(method, url, body, headers, opts) do {:ok, %{status_code: 200, body: body, headers: headers}} -> {:ok, body, headers} {:ok, %{status_code: 404, request_url: req_url} = _response} -> {:error, :not_found, request_url: req_url} {:ok, %{status_code: 400} = response} -> {:error, :invalid_request, response: response} {:error, %{reason: reason}} -> {:error, :unexpected_error, reason: "error: #{inspect(reason)}", error_data: reason} end end defp impl, do: Application.get_env(:binance_http, :http_client, HTTPoison) end