Module: RespondToDig

Defined in:
lib/respond_to_dig.rb,
lib/respond_to_dig/version.rb

Constant Summary collapse

VERSION =
'1.0.1'.freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.diggable?(target) ⇒ Boolean

The reason why not purely duck typed by ‘[]` method is to avoid unexpected behavior, for example we won’t get ‘’o’‘ by `’foo’.dig(1)‘ by String#[].

Returns:

  • (Boolean)


12
13
14
15
16
# File 'lib/respond_to_dig.rb', line 12

def diggable?(target)
  target.is_a? Enumerable and
      target.respond_to? :[] and
      not target.respond_to? :dig
end

.respond_to_dig(receiver) ⇒ Object



4
5
6
7
8
# File 'lib/respond_to_dig.rb', line 4

def respond_to_dig(receiver)
  receiver.tap do |r|
    r.singleton_class.send(:include, RespondToDig) if RespondToDig.diggable? r
  end
end

Instance Method Details

#dig(key, *rest) ⇒ Object



19
20
21
22
23
24
25
26
27
28
# File 'lib/respond_to_dig.rb', line 19

def dig(key, *rest)
  value = RespondToDig::respond_to_dig(self[key])
  if value.nil? || rest.empty?
    value
  elsif value.respond_to?(:dig)
    value.dig(*rest)
  else
    fail TypeError, "#{value.class} does not have #dig method"
  end
end