Module: ParamGuard

Defined in:
lib/param_guard.rb,
lib/param_guard/version.rb,
lib/param_guard/param_definition.rb

Defined Under Namespace

Classes: ParamDefinition

Constant Summary collapse

InvalidParameters =
Class.new(StandardError)
ParameterMissing =
Class.new(InvalidParameters)
ParameterOfInvalidType =
Class.new(InvalidParameters)
VERSION =
"0.0.1"

Class Method Summary collapse

Class Method Details

.filter(params, defs, parent_keys = []) ⇒ Object

Sanitiize params based on rules in defs. Returns a duplicate of params, from which all non-declared fields are deleted. Raises errors ParameterMissing or ParameterOfInvalidType.



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/param_guard.rb', line 13

def filter(params, defs, parent_keys = [])
  return params if defs.nil?
  keys_to_keep = []
  defs.each do |key, key_def|
    definition = ParamDefinition.new(*key_def)
    structure, value, params_to_keep = get_param(params, key)
    if value
      if definition.types.any?
        unless definition.types.any?{|t| is_of_type?(t, value, structure)}
          raise ParameterOfInvalidType.new(
            "param '#{keys_to_s(parent_keys + [key])}' must be #{definition.types_for_sentence}"
          )
        end
      end
      keys_to_keep.concat params_to_keep.keys.map(&:to_s)
      if structure == :normal && value.kind_of?(Hash)
        params[key] = filter(value, definition.subdef, parent_keys + [key])
      end
    elsif definition.required?
      raise ParameterMissing.new(
        "param '#{keys_to_s(parent_keys + [key])}' is missing"
      )
    end
  end
  filtered = params.dup
  filtered.delete_if{|key, value| ! keys_to_keep.include? key.to_s }
  filtered
end