Sha256: 9d6fac02d9d06fd293fb64d56e6713bd7be5be5332e026f30dcfb0356707f2f3

Contents?: true

Size: 1.94 KB

Versions: 1

Compression:

Stored size: 1.94 KB

Contents

# frozen_string_literal: true

require 'uri_template'

module OpenapiParameters
  # Parses OpenAPI path parameters from path template strings and the request path.
  class Path
    # @param parameters [Array<Hash>] The OpenAPI path parameters.
    # @param path [String] The OpenAPI path template string.
    # @param convert [Boolean] Whether to convert the values to the correct type.
    def initialize(parameters, path, convert: true)
      @parameters = parameters
      @path = path
      @convert = convert
    end

    attr_reader :parameters, :path

    def unpack(path_info)
      parsed_path = URITemplate.new(url_template).extract(path_info) || {}
      parameters.each_with_object(parsed_path) do |param, result|
        parameter = Parameter.new(param)
        next unless parsed_path.key?(parameter.name)

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

    def unpack_parameter(parameter, parsed_path)
      value = parsed_path[parameter.name]
      if parameter.object? && value.is_a?(Array)
        throw :skip, value if value.length.odd?
        return Hash[*value]
      end
      value
    end

    def url_template
      @url_template ||=
        begin
          path = @path.dup
          parameters.each do |p|
            param = Parameter.new(p)
            next unless param.array? || param.object?

            path.gsub!(
              "{#{param.name}}",
              "{#{operator(param)}#{param.name}#{modifier(param)}}"
            )
          end
          path
        end
    end

    private

    LIST_OPS = { 'simple' => nil, 'label' => '.', 'matrix' => ';' }.freeze
    private_constant :LIST_OPS

    def operator(param)
      LIST_OPS[param.style]
    end

    def modifier(param)
      return '*' if param.explode?
      return if param.style == 'matrix' && !param.explode?
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
openapi_parameters-0.1.0 lib/openapi_parameters/path.rb