Sha256: 337a9d0df0bd6270d816304d39dcdb12f4ad337eeb3355132096f9340afdbdf0

Contents?: true

Size: 1.16 KB

Versions: 6

Compression:

Stored size: 1.16 KB

Contents

# frozen_string_literal: true

module FriendlyShipping
  module Services
    class Ups
      class ParseXMLResponse
        extend Dry::Monads::Result::Mixin
        SUCCESSFUL_RESPONSE_STATUS_CODE = '1'

        class << self
          def call(response_body, expected_root_tag)
            xml = Nokogiri.XML(response_body)
            if xml.root.nil? || xml.root.name != expected_root_tag
              Failure('Invalid document')
            end
            if request_successful?(xml)
              Success(xml)
            else
              Failure(error_message(xml))
            end
          rescue Nokogiri::XML::SyntaxError => e
            Failure(e)
          end

          private

          def request_successful?(xml)
            xml.root.at('Response/ResponseStatusCode').text == SUCCESSFUL_RESPONSE_STATUS_CODE
          end

          def error_message(xml)
            status = xml.root.at_xpath('Response/ResponseStatusDescription')&.text
            desc = xml.root.at_xpath('Response/Error/ErrorDescription')&.text
            [status, desc].compact.join(": ").presence || 'UPS could not process the request.'
          end
        end
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
friendly_shipping-0.3.4 lib/friendly_shipping/services/ups/parse_xml_response.rb
friendly_shipping-0.3.3 lib/friendly_shipping/services/ups/parse_xml_response.rb
friendly_shipping-0.3.0 lib/friendly_shipping/services/ups/parse_xml_response.rb
friendly_shipping-0.2.6 lib/friendly_shipping/services/ups/parse_xml_response.rb
friendly_shipping-0.2.5 lib/friendly_shipping/services/ups/parse_xml_response.rb
friendly_shipping-0.2.4 lib/friendly_shipping/services/ups/parse_xml_response.rb