Current section
Files
Jump to
Current section
Files
lib/bingex/api/api.ex
defmodule Bingex.API do
@moduledoc false
alias Bingex.HTTP.Response
alias Bingex.API.{Reply, Error}
@spec process_response(Response.t()) :: {:ok, Reply.t()} | {:error, Error.t()}
def process_response(%Response{} = resp) do
with(
:ok <- validate_response_status(resp),
{:ok, payload} <- decode_response_body(resp)
) do
reply = %Reply{
code: payload["code"],
message: payload["msg"],
payload: payload
}
{:ok, reply}
end
end
def decode_response_body(%Response{body: nil}), do: {:ok, nil}
def decode_response_body(%Response{body: ""}), do: {:ok, nil}
def decode_response_body(%Response{} = resp) do
case JSON.decode(resp.body) do
{:ok, payload} ->
{:ok, payload}
{:error, _reason} ->
{:error, Error.exception(:bad_decode)}
end
end
def validate_response_status(%Response{} = resp, statuses \\ [200, 201, 204]) do
if resp.status in statuses do
:ok
else
{:error, Error.exception(:bad_status)}
end
end
end