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