Sha256: 704e9ab2ede531581c76187cadb7c2622d952c972c90c4b9615528733eb71d98

Contents?: true

Size: 1.64 KB

Versions: 3

Compression:

Stored size: 1.64 KB

Contents

# frozen_string_literal: true

module OpenapiParameters
  # Header parses OpenAPI parameters from the request headers.
  class Header
    # @param parameters [Array<Hash>] The OpenAPI parameters
    # @param convert [Boolean] Whether to convert the values to the correct type.
    def initialize(parameters, convert: true)
      @parameters = parameters
      @convert = convert
    end

    # @param headers [Hash] The headers from the request. Use HeadersHash to convert a Rack env to a Hash.
    def unpack(headers)
      parameters.each_with_object({}) do |parameter, result|
        parameter = Parameter.new(parameter)
        next unless headers.key?(parameter.name)

        result[parameter.name] = catch :skip do
          value = unpack_parameter(parameter, headers)
          @convert ? Converter.call(value, parameter.schema) : value
        end
      end
    end

    def unpack_env(env)
      unpack(HeadersHash.new(env))
    end

    attr_reader :parameters

    private

    def unpack_parameter(parameter, headers)
      value = headers[parameter.name]
      return value if parameter.primitive?
      return unpack_object(parameter, value) if parameter.object?
      return unpack_array(value) if parameter.array?
    end

    def unpack_array(value)
      value.split(ARRAY_DELIMER)
    end

    ARRAY_DELIMER = ','
    OBJECT_EXPLODE_SPLITTER = Regexp.union(',', '=').freeze

    def unpack_object(parameter, value)
      entries =
        if parameter.explode?
          value.split(OBJECT_EXPLODE_SPLITTER)
        else
          value.split(ARRAY_DELIMER)
        end
      throw :skip, value if entries.length.odd?

      Hash[*entries]
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
openapi_parameters-0.2.1 lib/openapi_parameters/header.rb
openapi_parameters-0.2.0 lib/openapi_parameters/header.rb
openapi_parameters-0.1.0 lib/openapi_parameters/header.rb