Sha256: fd3abfd14e091ac9f113cf7d1912625ac85c2b749e582907ef9c5ca1534207d7

Contents?: true

Size: 1.54 KB

Versions: 2

Compression:

Stored size: 1.54 KB

Contents

# frozen_string_literal: true

require 'rack'

module OpenapiParameters
  # Query parses query parameters from a http query strings.
  class Query
    # @param parameters [Array<Hash>] The OpenAPI query parameter definitions.
    # @param convert [Boolean] Whether to convert the values to the correct type.
    def initialize(parameters, convert: true)
      @parameters = parameters
      @convert = convert
    end

    def unpack(query_string) # rubocop:disable Metrics/AbcSize
      parsed_query = Rack::Utils.parse_query(query_string)
      parameters.each_with_object({}) do |parameter, result|
        parameter = Parameter.new(parameter)
        if parameter.style == 'deepObject' && parameter.object?
          parsed_nested_query = Rack::Utils.parse_nested_query(query_string)
          next unless parsed_nested_query.key?(parameter.name)

          result[parameter.name] = convert(parsed_nested_query[parameter.name], parameter)
        else
          next unless parsed_query.key?(parameter.name)

          value = Unpacker.unpack_value(parameter, parsed_query[parameter.name])
          result[parameter.name] = convert(value, parameter)
        end
      end
    end

    attr_reader :parameters

    private

    def convert_primitive(value, parameter)
      return value unless @convert
      return value if value == ''

      Converter.convert_primitive(value, parameter.schema)
    end

    def convert(value, parameter)
      return value unless @convert
      return value if value == ''

      Converter.convert(value, parameter.schema)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
openapi_parameters-0.3.1 lib/openapi_parameters/query.rb
openapi_parameters-0.3.0 lib/openapi_parameters/query.rb