Sha256: 80fcf1f22327f7bfadb5efa51472f02402251e00b5b2e9bfb8b935977f385d45

Contents?: true

Size: 1.04 KB

Versions: 27

Compression:

Stored size: 1.04 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.is_a? Array
            obj.fetch(arg)
          rescue ArgumentError, IndexError, NoMethodError => 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

27 entries across 24 versions & 4 rubygems

Version Path
tdiary-5.0.8 vendor/bundle/gems/hashie-3.5.7/lib/hashie/extensions/deep_fetch.rb
hashie-3.5.7 lib/hashie/extensions/deep_fetch.rb
hashie-3.5.6 lib/hashie/extensions/deep_fetch.rb
tdiary-5.0.5 vendor/bundle/gems/hashie-3.5.5/lib/hashie/extensions/deep_fetch.rb
tdiary-5.0.5 vendor/bundle/gems/tdiary-5.0.4/vendor/bundle/gems/hashie-3.5.5/lib/hashie/extensions/deep_fetch.rb
tdiary-5.0.4 vendor/bundle/gems/hashie-3.5.5/lib/hashie/extensions/deep_fetch.rb
hashie-3.5.5 lib/hashie/extensions/deep_fetch.rb
hashie-3.5.4 lib/hashie/extensions/deep_fetch.rb
hashie-3.5.3 lib/hashie/extensions/deep_fetch.rb
hashie-3.5.2 lib/hashie/extensions/deep_fetch.rb
hashie-3.5.1 lib/hashie/extensions/deep_fetch.rb
hashie-3.5.0 lib/hashie/extensions/deep_fetch.rb
logstash-input-salesforce-3.0.0 vendor/jruby/1.9/gems/hashie-3.4.6/lib/hashie/extensions/deep_fetch.rb
hashie-3.4.6 lib/hashie/extensions/deep_fetch.rb
hashie-3.4.5 lib/hashie/extensions/deep_fetch.rb
hashie-3.4.4 lib/hashie/extensions/deep_fetch.rb
tdiary-4.2.1 vendor/bundle/ruby/2.2.0/gems/hashie-3.4.3/lib/hashie/extensions/deep_fetch.rb
tdiary-4.2.1 vendor/bundle/ruby/2.3.0/gems/hashie-3.4.3/lib/hashie/extensions/deep_fetch.rb
hashie-3.4.3 lib/hashie/extensions/deep_fetch.rb
hashie-3.4.2 lib/hashie/extensions/deep_fetch.rb