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