Current section
Files
Jump to
Current section
Files
lib/api_brasil/core/credit_response.ex
defmodule ApiBrasil.Core.CreditResponse do
@moduledoc """
Envelope de resposta das consultas por crédito
(`%{"error" => ..., "message" => ..., "balance" => ..., "tax" => ...,
"valor_consulta" => ..., "data" => ...}`).
Traz acessores nomeados e implementa `Access` — o acesso por chave
continua funcionando:
{:ok, consulta} = ApiBrasil.Data.Consulta.cnpj(client, %{"cnpj" => "00000000000000"})
ApiBrasil.Core.CreditResponse.data(consulta) # dados da consulta
ApiBrasil.Core.CreditResponse.balance(consulta) # saldo restante
consulta["data"] # o mesmo, por chave
"""
@behaviour Access
@type t :: %__MODULE__{json: map()}
defstruct json: %{}
@doc "Embrulha o mapa JSON no envelope."
@spec new(map()) :: t()
def new(json) when is_map(json), do: %__MODULE__{json: json}
@doc "Informa se o gateway sinalizou erro no envelope."
@spec error?(t()) :: boolean()
def error?(%__MODULE__{json: json}), do: Map.get(json, "error") == true
@doc "Mensagem devolvida pelo gateway."
@spec message(t()) :: String.t() | nil
def message(%__MODULE__{json: json}), do: Map.get(json, "message")
@doc "Saldo restante após a consulta."
@spec balance(t()) :: term()
def balance(%__MODULE__{json: json}), do: Map.get(json, "balance")
@doc "Taxa aplicada."
@spec tax(t()) :: term()
def tax(%__MODULE__{json: json}), do: Map.get(json, "tax")
@doc "Valor cobrado pela consulta."
@spec valor_consulta(t()) :: term()
def valor_consulta(%__MODULE__{json: json}), do: Map.get(json, "valor_consulta")
@doc "Informa se a resposta veio do modo homologação."
@spec homolog?(t()) :: boolean()
def homolog?(%__MODULE__{json: json}), do: Map.get(json, "homolog") == true
@doc "Dados da consulta."
@spec data(t()) :: term()
def data(%__MODULE__{json: json}), do: Map.get(json, "data")
@doc "Devolve o envelope completo como mapa."
@spec to_map(t()) :: map()
def to_map(%__MODULE__{json: json}), do: json
@impl Access
def fetch(%__MODULE__{json: json}, key), do: Map.fetch(json, key)
@impl Access
def get_and_update(%__MODULE__{json: json} = envelope, key, function) do
{value, updated} = Map.get_and_update(json, key, function)
{value, %{envelope | json: updated}}
end
@impl Access
def pop(%__MODULE__{json: json} = envelope, key) do
{value, updated} = Map.pop(json, key)
{value, %{envelope | json: updated}}
end
end