Skip to main content

lib/cnpja/error.ex

defmodule Cnpja.Error do
  @moduledoc "Error returned by the CNPJá API."

  defstruct [:status, :message, :constraints, :required, :remaining, :raw]

  @type t :: %__MODULE__{
          status: integer(),
          message: String.t(),
          constraints: [String.t()] | nil,
          required: integer() | nil,
          remaining: integer() | nil,
          raw: map()
        }

  @doc false
  @spec from_response(integer(), map()) :: t()
  def from_response(400, body) do
    %__MODULE__{
      status: 400,
      message: body["message"] || "Validation error",
      constraints: body["constraints"] || [],
      raw: body
    }
  end

  def from_response(429, body) do
    %__MODULE__{
      status: 429,
      message: body["message"] || "Rate limit exceeded",
      required: body["required"],
      remaining: body["remaining"],
      raw: body
    }
  end

  def from_response(status, body) do
    %__MODULE__{
      status: status,
      message: body["message"] || "HTTP #{status}",
      raw: body
    }
  end
end