Sha256: 14c3ced28bbaac0d63db82f8836027456ab3c2b3fe551890e86d596772642274
Contents?: true
Size: 1.74 KB
Versions: 2
Compression:
Stored size: 1.74 KB
Contents
# frozen_string_literal: true module FriendlyShipping module Services class UpsJson class ParseJsonResponse extend Dry::Monads::Result::Mixin SUCCESSFUL_RESPONSE_STATUS_CODE = '1' UNEXPECTED_ROOT_KEY_STRING = 'Empty or unexpected root key' class << self def call(request:, response:, expected_root_key:) api_error_message = response.headers.try(:[], :errordescription) response_body = JSON.parse(response.body) # UPS may return a 2xx status code on an unsuccessful request and include the error description in # the response headers, which we will consider a failure if api_error_message.present? wrap_failure(api_error(api_error_message), request, response) elsif response_body.nil? || response_body.keys.first != expected_root_key wrap_failure(api_error(UNEXPECTED_ROOT_KEY_STRING), request, response) else Success(response_body) end rescue JSON::ParserError => e # when the response is not valid JSON(?!), the error description in the header is more descriptive return wrap_failure(api_error(api_error_message), request, response) if api_error_message wrap_failure(e, request, response) end private def api_error(message) FriendlyShipping::ApiError.new(nil, message) end def wrap_failure(error, request, response) Failure( FriendlyShipping::ApiResult.new( error, original_request: request, original_response: response ) ) end end end end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
friendly_shipping-0.10.1 | lib/friendly_shipping/services/ups_json/parse_json_response.rb |
friendly_shipping-0.10.0 | lib/friendly_shipping/services/ups_json/parse_json_response.rb |