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