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