lib/client.ex

defmodule Payeezy.Client do
  @moduledoc """
  Client module for Payeezy API.
  """

  @doc """
  Performs POST request and returns parsed response.
  """
  @spec post(String.t(), any()) ::
          {:ok, map()} | {:error, :unauthorized | :not_found | map() | String.t()}
  def post(url, params) do
    url
    |> Payeezy.HTTP.post(params)
    |> parse_response()
  end

  @spec parse_response({atom(), String.t() | map()}) :: {:ok, any()} | {:error, any()}
  defp parse_response({:ok, %{status_code: code, body: body}})
       when code >= 200 and code <= 399,
       do: {:ok, body}

  defp parse_response({:ok, %{status_code: 401}}),
    do: {:error, :unauthorized}

  defp parse_response({:ok, %{status_code: 404}}),
    do: {:error, :not_found}

  defp parse_response({:ok, %{body: body}}),
    do: {:error, body}

  defp parse_response({_code, %HTTPoison.Error{reason: reason}}),
    do: {:error, inspect(reason)}
end