Module: FluvPay::Errors

Defined in:
lib/fluvpay/errors.rb

Class Method Summary collapse

Class Method Details

.from_response(status_code, body, retry_after_header: nil) ⇒ FluvPay::Error

Converte uma resposta de erro (status + corpo já parseado) na exceção tipada correspondente. Usado internamente pelo cliente HTTP.

Parameters:

  • status_code (Integer)

    status HTTP da resposta.

  • body (Hash, nil)

    corpo JSON já parseado (espera-se a chave “error”).

  • retry_after_header (String, nil) (defaults to: nil)

    valor cru do header Retry-After.

Returns:



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/fluvpay/errors.rb', line 77

def self.from_response(status_code, body, retry_after_header: nil)
  error_body = body.is_a?(Hash) ? (body["error"] || body[:error]) : nil
  error_body = {} unless error_body.is_a?(Hash)

  code = error_body["code"] || error_body[:code]
  message = error_body["message"] || error_body[:message] || default_message(status_code)
  details = error_body["details"] || error_body[:details] || []
  trace_id = error_body["trace_id"] || error_body[:trace_id]

  kwargs = { code: code, details: details, trace_id: trace_id, status_code: status_code }

  case status_code
  when 400, 422
    ValidationError.new(message, **kwargs)
  when 401
    AuthenticationError.new(message, **kwargs)
  when 403
    PermissionError.new(message, **kwargs)
  when 404
    NotFoundError.new(message, **kwargs)
  when 409
    ConflictError.new(message, **kwargs)
  when 429
    RateLimitError.new(message, retry_after: parse_retry_after(retry_after_header), **kwargs)
  else
    if status_code >= 500
      ServerError.new(message, **kwargs)
    else
      Error.new(message, **kwargs)
    end
  end
end