Sha256: eb8d950876aaf97a375e7ea2f61b7a6b486f7eb733102a678147c41fa9689709

Contents?: true

Size: 1.8 KB

Versions: 21

Compression:

Stored size: 1.8 KB

Contents

# frozen_string_literal: true

module FriendlyShipping
  module Services
    class Ups
      class ParseAddressValidationResponse
        extend Dry::Monads::Result::Mixin

        def self.call(request:, response:)
          parsing_result = ParseXMLResponse.call(response.body, 'AddressValidationResponse')

          parsing_result.bind do |xml|
            if xml.at('NoCandidatesIndicator')
              Failure(
                FriendlyShipping::ApiFailure.new(
                  'Address is probably invalid. No similar valid addresses found.',
                  original_request: request,
                  original_response: response
                )
              )
            else
              Success(
                FriendlyShipping::ApiResult.new(
                  build_suggestions(xml),
                  original_request: request,
                  original_response: response
                )
              )
            end
          end
        end

        def self.build_suggestions(xml)
          xml.xpath('//AddressKeyFormat').map do |address_fragment|
            Physical::Location.new(
              address1: address_fragment.xpath('AddressLine[1]')[0]&.text,
              address2: address_fragment.xpath('AddressLine[2]')[0]&.text,
              company_name: address_fragment.at('ConsigneeName')&.text,
              city: address_fragment.at('PoliticalDivision2')&.text,
              region: address_fragment.at('PoliticalDivision1')&.text,
              country: address_fragment.at('CountryCode')&.text,
              zip: "#{address_fragment.at('PostcodePrimaryLow')&.text}-#{address_fragment.at('PostcodeExtendedLow')&.text}",
              address_type: address_fragment.at('AddressClassification/Description')&.text&.downcase
            )
          end
        end
      end
    end
  end
end

Version data entries

21 entries across 21 versions & 1 rubygems

Version Path
friendly_shipping-0.5.2 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.5.1 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.5 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.4.14 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.4.13 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.4.12 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.4.11 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.4.10 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.4.9 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.4.8 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.4.7 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.4.6 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.4.5 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.4.4 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.4.3 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.4.2 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.4.1 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.4.0 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.3.4 lib/friendly_shipping/services/ups/parse_address_validation_response.rb
friendly_shipping-0.3.3 lib/friendly_shipping/services/ups/parse_address_validation_response.rb