1# frozen_string_literal: true
2
3require "ruby-bandwidth-iris"
4
5# rubocop:disable Metrics/AbcSize
6module BandwidthIris
7 class APIError < StandardError
8 attr_reader :code
9
10 def self.for_response_status(description:, error_code:)
11 new(description: description, code: error_code)
12 end
13
14 def initialize(description:, code: nil)
15 super(description)
16 @code = code
17 end
18 end
19
20 class APIErrors < StandardError
21 attr_reader :errors
22
23 def initialize(errors)
24 errors = [errors] unless errors.is_a?(Array)
25 super(errors.map { |e| e[:description] }.join("\n"))
26 @errors = errors
27 end
28 end
29
30 class Client
31 # Expose useful error messages from the API instead of hiding them
32 def check_response(response)
33 parsed_body = parse_xml(response.body || "")
34 return parsed_body unless response.status >= 400
35 raise APIError.new(**parsed_body[:error]) if parsed_body&.key?(:error)
36
37 if parsed_body&.key?(:response_status)
38 raise APIError.for_response_status(**parsed_body[:response_status])
39 end
40
41 raise APIErrors, parsed_body[:errors] if parsed_body&.key?(:errors)
42
43 raise Errors::GenericError.new(
44 response.status, response.reason_phrase, response.headers, nil
45 )
46 end
47 end
48end
49# rubocop:enable Metrics/AbcSize