module DeepSymbolizable::Symbolizers

Public Instance Methods

_recurse_(value, &block) click to toggle source

handling recursion - any Enumerable elements (except String) is being extended with the module, and then symbolized

# File lib/vendor/deep_symbolize.rb, line 50
def _recurse_(value, &block)
  if value.is_a?(Enumerable) && !value.is_a?(String)
    # support for a use case without extended core Hash
    value.extend DeepSymbolizable unless value.class.include?(DeepSymbolizable)
    value = value.deep_symbolize(&block)
  end
  value
end
array(ary, &block) click to toggle source

walking over arrays and symbolizing all nested elements

# File lib/vendor/deep_symbolize.rb, line 44
def array(ary, &block)
  ary.map { |v| _recurse_(v, &block) }
end
hash(hash) { |key| ... } click to toggle source

the primary method - symbolizes keys of the given hash, preprocessing them with a block if one was given, and recursively going into all nested enumerables

# File lib/vendor/deep_symbolize.rb, line 27
def hash(hash, &block)
  hash.inject({}) do |result, (key, value)|
    # Recursively deep-symbolize subhashes
    value = _recurse_(value, &block)

    # Pre-process the key with a block if it was given
    key = yield key if block_given?
    # Symbolize the key string if it responds to to_sym
    sym_key = key.to_sym rescue key

    # write it back into the result and return the updated hash
    result[sym_key] = value
    result
  end
end