Sha256: 25621a440d2743b35a5172e543200f43d747abbecbc0be3c50a5638e1eca5cdd

Contents?: true

Size: 1.36 KB

Versions: 2

Compression:

Stored size: 1.36 KB

Contents

require 'rack/request'

module Simphi
  class Request < Rack::Request
    def normalize_hash_params
      params.each do |key, value|
        normalize_to_proper_params(value) if with_hash? value

        if with_hash? key
          param = delete_param(key)
          update_param(key.gsub(/-shi_hash/, ''), normalized_hash(param))
        end


      end if with_hash? params
    end

    private

    def with_hash?(param)
      return param =~ /-shi_hash/ if param.is_a? String
      return param.to_s =~ /-shi_hash/ if param.is_a? Hash
    end

    def normalized_hash(params)
      hashes = params.map do |_, v|
        if v.length <= 1 || !v.has_key?('key') || !v.has_key?('value')
          raise ArgumentError, 'Every hash element should include key and value'
        end

        { v['key'] => v['value'] } if v['key'].present? && v['value'].present?
      end.compact

      hashes.reduce Hash.new, :merge
    end

    def normalize_to_proper_params(hash)
      if hash.is_a? Hash

        list = hash.map do |k, v|
          normalize_to_proper_params(v) if with_hash? v

          if with_hash? k
            {
              key: k,
              obj: { k.gsub(/-shi_hash/, '') => normalized_hash(v) }
            }
          end

        end.compact

        list.each do |v|
          hash.delete(v[:key])
          hash.merge!(v[:obj])
        end

      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
simphi-0.0.2 lib/simphi/request.rb
simphi-0.0.1 lib/simphi/request.rb