Module: Hashie::Extensions::Coercion::InstanceMethods

Defined in:
lib/hashie/extensions/coercion.rb

Instance Method Summary collapse

Instance Method Details

#custom_writer(key, value, _convert = true) ⇒ Object



37
38
39
# File 'lib/hashie/extensions/coercion.rb', line 37

def custom_writer(key, value, _convert = true)
  self[key] = value
end

#replace(other_hash) ⇒ Object



41
42
43
44
45
# File 'lib/hashie/extensions/coercion.rb', line 41

def replace(other_hash)
  (keys - other_hash.keys).each { |key| delete(key) }
  other_hash.each { |key, value| self[key] = value }
  self
end

#set_value_with_coercion(key, value) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/hashie/extensions/coercion.rb', line 13

def set_value_with_coercion(key, value)
  into = self.class.key_coercion(key) || self.class.value_coercion(value)

  return set_value_without_coercion(key, value) unless value && into
  return set_value_without_coercion(key, coerce_or_init(into).call(value)) unless into.is_a?(Enumerable)

  if into.class >= Hash
    key_coerce = coerce_or_init(into.flatten[0])
    value_coerce = coerce_or_init(into.flatten[-1])
    value = Hash[value.map { |k, v| [key_coerce.call(k), value_coerce.call(v)] }]
  else # Enumerable but not Hash: Array, Set
    value_coerce = coerce_or_init(into.first)
    value = into.class.new(value.map { |v| value_coerce.call(v) })
  end

  set_value_without_coercion(key, value)
end