module DeepSymbolizable::Symbolizers

Used to symbolize hashes

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/deep_symbolize.rb, line 57
def _recurse_(value, &block)
  if value.is_a?(Enumerable) && !value.is_a?(String)
    # support for a use case without extended core Hash
    unless value.class.include?(DeepSymbolizable)
      value.extend DeepSymbolizable
    end
    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/deep_symbolize.rb, line 51
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/deep_symbolize.rb, line 31
def hash(hash, &block)
  hash.each_with_object({}) do |(key, value), result|
    # 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 = begin
                key.to_sym
              rescue StandardError
                key
              end

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