Sha256: 2890488bf7bbd806920de28e4b6de5697fcf4c0c360bef790abea26275bb2a5f
Contents?: true
Size: 1.03 KB
Versions: 3
Compression:
Stored size: 1.03 KB
Contents
module Hashie module Extensions # Searches a deeply nested datastructure for a key path, and returns the associated value. # # options = { user: { location: { address: '123 Street' } } } # options.deep_fetch :user, :location, :address #=> '123 Street' # # If a block is provided its value will be returned if the key does not exist. # # options.deep_fetch(:user, :non_existent_key) { 'a value' } #=> 'a value' # # This is particularly useful for fetching values from deeply nested api responses or params hashes. module DeepFetch class UndefinedPathError < StandardError; end def deep_fetch(*args, &block) args.reduce(self) do |obj, arg| begin arg = Integer(arg) if obj.kind_of? Array obj.fetch(arg) rescue ArgumentError, IndexError => e break block.call(arg) if block raise UndefinedPathError, "Could not fetch path (#{args.join(' > ')}) at #{arg}", e.backtrace end end end end end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
hashie-2.1.2 | lib/hashie/extensions/deep_fetch.rb |
hashie-2.1.1 | lib/hashie/extensions/deep_fetch.rb |
hashie-2.1.0 | lib/hashie/extensions/deep_fetch.rb |