Module: Paramore::CastParameters

Defined in:
lib/paramore/cast_parameters.rb

Class Method Summary collapse

Class Method Details

.cast(definition, value) ⇒ Object



40
41
42
43
44
45
46
47
48
49
# File 'lib/paramore/cast_parameters.rb', line 40

def cast(definition, value)
  case definition.type
  when Hash
    recursive_typecast(definition.type, value || {})
  when Array
    typecast_array(definition, value)
  else
    typecast_value(definition.type, value)
  end
end

.recursive_merge(nested_hash_array) ⇒ Object



14
15
16
17
18
19
20
21
22
# File 'lib/paramore/cast_parameters.rb', line 14

def recursive_merge(nested_hash_array)
  nested_hash_array.reduce(:merge).map do |param_name, value|
    if value.is_a?(Array) && value.all? { |_value| _value.is_a?(Hash) }
      { param_name => recursive_merge(value) }
    else
      { param_name => value }
    end
  end.reduce(:merge)
end

.recursive_typecast(types_definition, permitted_params) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/paramore/cast_parameters.rb', line 24

def recursive_typecast(types_definition, permitted_params)
  types_definition.map do |param_name, definition|
    value = permitted_params[param_name]

    if value.nil?
      if definition.nullable?
        next { param_name => nil }
      else
        raise Paramore::NilParameter, param_name
      end
    end

    { param_name => cast(definition, value) }
  end
end

.run(types_definition, permitted_params) ⇒ Object



6
7
8
9
10
11
12
# File 'lib/paramore/cast_parameters.rb', line 6

def run(types_definition, permitted_params)
  recursive_merge(
    recursive_typecast(
      types_definition, permitted_params
    )
  )
end

.typecast_array(definition, array) ⇒ Object



51
52
53
54
55
56
57
58
59
# File 'lib/paramore/cast_parameters.rb', line 51

def typecast_array(definition, array)
  array
    .reject { |unit| unit.to_s == '' && definition.compact? }
    .map do |unit|
      if unit.to_s != '' || definition.use_empty_strings?
        typecast_value(definition.type.first, unit)
      end
    end
end

.typecast_value(type, value) ⇒ Object



61
62
63
# File 'lib/paramore/cast_parameters.rb', line 61

def typecast_value(type, value)
  type.send(Paramore.configuration.type_method_name, value)
end