Method: HashExtension#deep_fetch

Defined in:
lib/hash_extension.rb

#deep_fetch(*keys, default: NOT_PRESENT, &block) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/hash_extension.rb', line 6

def deep_fetch(*keys, default: NOT_PRESENT, &block)
  keys.reduce(self) do |obj, arg|
    begin
      arg = Integer(arg) if obj.is_a? Array
      obj.fetch(arg)
    rescue => e
      break block.call(arg) if block
      if default.nil?
        nil
      elsif default == NOT_PRESENT
        raise KeyError, "Could not fetch keypath (#{keys.join('.')}) at #{arg}", e.backtrace
      else
        default
      end
    end
  end
end