Class: Zoom::Params

Inherits:
SimpleDelegator
  • Object
show all
Defined in:
lib/zoom/params.rb

Constant Summary collapse

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

Instance Method Summary collapse

Constructor Details

#initialize(parameters = {}) ⇒ Params

Returns a new instance of Params.



6
7
8
9
# File 'lib/zoom/params.rb', line 6

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

Instance Method Details

#except(*keys) ⇒ Object



39
40
41
# File 'lib/zoom/params.rb', line 39

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

#except!(keys) ⇒ Object



43
44
45
46
# File 'lib/zoom/params.rb', line 43

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

#filter_required(filters) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/zoom/params.rb', line 64

def filter_required(filters)
  # Unless value is a hash, filter
  filters.each.with_object(self.class.new(except(filters.flatten))) do |filter, params|
    case filter
    when Symbol, String
      params.delete(filter)
    when Hash
      filter.each do |k, v|
        nested_filter = self.class.new(self[k]).filter_required(v)
        if nested_filter.empty?
          params.delete(k)
        else
          params[k] = nested_filter
        end
      end
    end
  end
end

#find_matching_keys(keys) ⇒ Object



97
98
99
100
101
# File 'lib/zoom/params.rb', line 97

def find_matching_keys(keys)
  keys.flatten.each_with_object([]) do |key, array|
    array << key if self[key]
  end
end

#find_missing_entries(*entries) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/zoom/params.rb', line 83

def find_missing_entries(*entries)
  entries.flatten.each.with_object([]) do |entry, array|
    if entry.is_a?(Hash)
      entry.keys.each do |k|
        array << k && next if self[k].nil?
        missing_entries = self.class.new(self[k]).find_missing_entries(*entry[k])
        array << { k => missing_entries } unless missing_entries.empty?
      end
    elsif self[entry].nil?
      array << entry
    end
  end
end

#hash_filter(filter) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/zoom/params.rb', line 51

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

#permit(*filters) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/zoom/params.rb', line 26

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

#permit_value(key, values) ⇒ Object



103
104
105
106
107
108
# File 'lib/zoom/params.rb', line 103

def permit_value(key, values)
  value = @parameters[key]
  unless !value || values.include?(value)
    raise Zoom::ParameterValueNotPermitted, "#{key}: #{value}"
  end
end

#require(*entries) ⇒ Object



11
12
13
14
15
# File 'lib/zoom/params.rb', line 11

def require(*entries)
  missing_entries = find_missing_entries(entries)
  return filter_required(entries.flatten) if missing_entries.empty?
  raise Zoom::ParameterMissing, missing_entries.to_s
end

#require_one_of(*keys) ⇒ Object



17
18
19
20
21
22
23
24
# File 'lib/zoom/params.rb', line 17

def require_one_of(*keys)
  required_keys = keys
  keys = find_matching_keys(keys.flatten)
  unless keys.any?
    message = required_keys.length > 1 ? "You are missing atleast one of #{required_keys}" : required_keys
    raise Zoom::ParameterMissing, message
  end
end