Sha256: 5793ea84bdcaf15ab718108e53a44de6b163ce93fd71a87ed1710bf5bd35d8c9

Contents?: true

Size: 1.99 KB

Versions: 4

Compression:

Stored size: 1.99 KB

Contents

# frozen_string_literal: true

module OpenapiParameters
  ## Unpacks a paramexter value from a string as defined in the OpenAPI specification.
  # @visibility private
  module Unpacker
    class << self
      def unpack_value(parameter, value)
        return value if value.nil?
        return unpack_array(parameter, value) if parameter.array?
        return unpack_object(parameter, value) if parameter.object?

        value
      end

      def unpack_array(parameter, value)
        return value if value.is_a?(Array)
        return value if value.empty?
        return unpack_matrix(parameter, value) if parameter.style == 'matrix'

        value = value[1..] if PREFIXED.key?(parameter.style)
        value.split(ARRAY_DELIMITER[parameter.style])
      end

      def unpack_matrix(parameter, value)
        result = Rack::Utils.parse_query(value, ';')[parameter.name]
        return result if parameter.explode?

        result.split(',')
      end

      OBJECT_EXPLODE_SPLITTER = Regexp.union(',', '=').freeze
      private_constant :OBJECT_EXPLODE_SPLITTER

      def unpack_object(parameter, value)
        return unpack_object_path(parameter, value) if parameter.location == 'path'

        entries =
          if parameter.explode?
            value.split(OBJECT_EXPLODE_SPLITTER)
          else
            value.split(ARRAY_DELIMITER[parameter.style])
          end
        throw :skip, value if entries.length.odd?

        Hash[*entries]
      end

      def unpack_object_path(parameter, value)
        return Rack::Utils.parse_query(value, ',') if parameter.explode?

        array = unpack_array(parameter, value)
        throw :skip, value if array.length.odd?

        Hash[*array]
      end

      PREFIXED = {
        'label' => '.',
        'matrix' => ';'
      }.freeze

      ARRAY_DELIMITER = {
        'label' => '.',
        'simple' => ',',
        'form' => ',',
        'pipeDelimited' => '|',
        'spaceDelimited' => ' '
      }.freeze
      private_constant :ARRAY_DELIMITER
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
openapi_parameters-0.3.2 lib/openapi_parameters/unpacker.rb
openapi_parameters-0.3.1 lib/openapi_parameters/unpacker.rb
openapi_parameters-0.3.0 lib/openapi_parameters/unpacker.rb
openapi_parameters-0.2.2 lib/openapi_parameters/unpacker.rb