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