Sha256: 48d2dc6edd1ec47ddba0463cc0e405931e6eac980766b4676c4361f27482d606

Contents?: true

Size: 1.82 KB

Versions: 2

Compression:

Stored size: 1.82 KB

Contents

# frozen_string_literal: true
require 'pry'
module Zoom
  class Params < SimpleDelegator
    # delegate :keys, :key?, :has_key?, :values, :has_value?, :value?, :empty?,
    #          :include?, :as_json, :to_s, :each_key, to: :@parameters

    def initialize(parameters = {})
      @parameters = parameters
      super
    end


    def require(*keys)
      missing_keys = find_missing_keys(keys.flatten)
      return self.class.new(except(keys)) if missing_keys.empty?
      raise Zoom::ParameterMissing, missing_keys.to_s
    end

    def permit(*filters)
      permitted_keys = filters.flatten.each_with_object([]) do |filter, array|
                         case filter
                         when Symbol, String
                           array << filter
                         when Hash
                           array << hash_filter(filter)
                         end
                       end
      non_permitted_params = @parameters.keys - permitted_keys.flatten
      raise Zoom::ParameterNotPermitted, non_permitted_params.to_s unless non_permitted_params.empty?
    end

    def except(*keys)
      dup.except!(keys.flatten)
    end

    def except!(keys)
      keys.each { |key| delete(key) }
      self
    end

    EMPTY_ARRAY = [].freeze
    EMPTY_HASH  = {}.freeze

    def hash_filter(filter)
      # Slicing filters out non-declared keys.
      slice(*filter.keys).each do |key, value|
        next unless value
        next unless key? key
        next if filter[key] == EMPTY_ARRAY
        next if filter[key] == EMPTY_HASH
        # Declaration { user: :name } or { user: [:name, :age, { address: ... }] }.
        self.class.new(value).permit(filter[key])
      end
      filter.keys
    end

    def find_missing_keys(keys)
      keys.each_with_object([]) do |k, array|
        array << k if self[k].nil?
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
zoom_rb-0.8.2 lib/zoom/params.rb
zoom_rb-0.8.1 lib/zoom/params.rb