Sha256: fa4f442b284f48aa79732fd3a9fa08ad9ba453e11f7c4bc735bbef2b1e1e3deb

Contents?: true

Size: 1.64 KB

Versions: 2

Compression:

Stored size: 1.64 KB

Contents

# frozen_string_literal: true

module FriendlyShipping
  module Services
    class ShipEngineLTL
      # Parses the carriers API response.
      class ParseCarrierResponse
        extend Dry::Monads::Result::Mixin

        class << self
          # @param request [Request] the request to attach to the API result
          # @param response [Response] the response to parse
          # @return [Success<ApiResult<Array<Carrier>>>, Failure<ApiResult<Array<String>>>] the parsed carriers or errors
          def call(request:, response:)
            parsed_json = JSON.parse(response.body)
            carriers = parsed_json.fetch('carriers', []).map do |carrier_data|
              FriendlyShipping::Carrier.new(
                id: carrier_data['carrier_id'],
                name: carrier_data['name'],
                data: {
                  countries: carrier_data['countries'],
                  features: carrier_data['features'],
                  scac: carrier_data['scac']
                }
              )
            end

            if carriers.any?
              Success(
                ApiResult.new(
                  carriers,
                  original_request: request,
                  original_response: response
                )
              )
            else
              errors = parsed_json.fetch('errors', [{ 'message' => 'Unknown error' }])
              Failure(
                ApiResult.new(
                  errors.map { |e| e['message'] },
                  original_request: request,
                  original_response: response
                )
              )
            end
          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/ship_engine_ltl/parse_carrier_response.rb
friendly_shipping-0.10.0 lib/friendly_shipping/services/ship_engine_ltl/parse_carrier_response.rb