module Dry::Config::DeepSymbolizable::Symbolizers

Public Instance Methods

_recurse_(value, invert, &block) click to toggle source

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

# File lib/dry/config/deep_symbolizable.rb, line 64
def _recurse_(value, invert, &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(invert, &block)
  end
  value
end
array(ary, invert, &block) click to toggle source

walking over arrays and symbolizing all nested elements

# File lib/dry/config/deep_symbolizable.rb, line 58
def array(ary, invert, &block)
  ary.map { |v| _recurse_(v, invert, &block) }
end
hash(hash, invert) { |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/dry/config/deep_symbolizable.rb, line 31
def hash(hash, invert, &block)
  hash.inject({}) do |result, (key, value)|
    # Recursively deep-symbolize subhashes
    value = _recurse_(value, invert, &block)

    # Pre-process the key with a block if it was given
    key = yield key if block_given?

    if invert
      # UN-Symbolize the key
      s_key = key.to_s rescue key

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

    else
      # 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
    end
    result
  end
end