# frozen_string_literal: true require "ruby-bandwidth-iris" # rubocop:disable Metrics/AbcSize module BandwidthIris class APIError < StandardError attr_reader :code def self.for_response_status(description:, error_code:) new(description: description, code: error_code) end def initialize(description:, code: nil) super(description) @code = code end end class APIErrors < StandardError attr_reader :errors def initialize(errors) errors = [errors] unless errors.is_a?(Array) super(errors.map { |e| e[:description] }.join("\n")) @errors = errors end end class Client # Expose useful error messages from the API instead of hiding them def check_response(response) parsed_body = parse_xml(response.body || "") return parsed_body unless response.status >= 400 raise APIError.new(**parsed_body[:error]) if parsed_body&.key?(:error) if parsed_body&.key?(:response_status) raise APIError.for_response_status(**parsed_body[:response_status]) end raise APIErrors, parsed_body[:errors] if parsed_body&.key?(:errors) raise Errors::GenericError.new( response.status, response.reason_phrase, response.headers, nil ) end end end # rubocop:enable Metrics/AbcSize