class Hanami::Routing::Parsers

@since 0.2.0 @api private

Constants

CONTENT_TYPE

@since 0.2.0 @api private

FALLBACK_KEY

@api private

MEDIA_TYPE_MATCHER

@since 0.2.0 @api private

RACK_INPUT

@since 0.2.0 @api private

ROUTER_PARAMS

@since 0.2.0 @api private

ROUTER_PARSED_BODY

@api private

Public Class Methods

new(parsers) click to toggle source

@since 0.2.0 @api private

# File lib/hanami/routing/parsers.rb, line 33
def initialize(parsers)
  @parsers = prepare(parsers)
  _redefine_call
end

Public Instance Methods

call(env) click to toggle source

@since 0.2.0 @api private

# File lib/hanami/routing/parsers.rb, line 40
def call(env)
  env
end

Private Instance Methods

_parse(env, body) click to toggle source

@api private

# File lib/hanami/routing/parsers.rb, line 93
def _parse(env, body)
  @parsers[
    media_type(env)
  ].parse(body)
end
_redefine_call() click to toggle source

@since 0.2.0 @api private

# File lib/hanami/routing/parsers.rb, line 66
def _redefine_call
  return if @parsers.empty?

  define_singleton_method :call do |env|
    body = env[RACK_INPUT].read
    return env if body.empty?

    env[RACK_INPUT].rewind    # somebody might try to read this stream

    env[ROUTER_PARAMS] ||= {} # prepare params
    env[ROUTER_PARSED_BODY] = _parse(env, body)
    env[ROUTER_PARAMS]      = _symbolize(env[ROUTER_PARSED_BODY]).merge(env[ROUTER_PARAMS])

    env
  end
end
_symbolize(body) click to toggle source

@api private

# File lib/hanami/routing/parsers.rb, line 84
def _symbolize(body)
  if body.is_a?(Hash)
    Utils::Hash.deep_symbolize(body)
  else
    { FALLBACK_KEY => body }
  end
end
content_type(env) click to toggle source

@api private

# File lib/hanami/routing/parsers.rb, line 107
def content_type(env)
  content_type = env[CONTENT_TYPE]
  content_type.nil? || content_type.empty? ? nil : content_type
end
media_type(env) click to toggle source

@api private

# File lib/hanami/routing/parsers.rb, line 100
def media_type(env)
  if ct = content_type(env)
    ct.split(MEDIA_TYPE_MATCHER, 2).first.downcase
  end
end
prepare(args) click to toggle source

@since 0.2.0 @api private

# File lib/hanami/routing/parsers.rb, line 47
def prepare(args)
  result  = Hash.new
  args    = Array(args)
  return result if args.empty?

  args.each do |arg|
    parser = Parsing::Parser.for(arg)

    parser.mime_types.each do |mime|
      result[mime] = parser
    end
  end

  result.default = Parsing::Parser.new
  result
end