Skip to content

Instantly share code, notes, and snippets.

@hayduke19us
Created January 25, 2017 22:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hayduke19us/cd4375debaaf73f0266d20de8de8fdf2 to your computer and use it in GitHub Desktop.
Save hayduke19us/cd4375debaaf73f0266d20de8de8fdf2 to your computer and use it in GitHub Desktop.
module StrictDig
def strict_dig(*keys, map: false, strict: true, value_key: false)
outer_layer = self
layers = value_key ? keys.push(value_key) : keys
original_keys = layers.dup
while layers.any?
current_layer = layers.shift
fetching_args = strict ? [current_layer] : [current_layer].push(nil)
inner_layer = if map
outer_layer.map { |element| element.fetch(*fetching_args) }
else
outer_layer.fetch(*fetching_args)
end
outer_layer = inner_layer
end
inner_layer.is_a?(String) ? inner_layer.strip : inner_layer
rescue KeyError, IndexError => e
raise e, "Original strict_dig argument: #{original_keys}. #{e.message.capitalize}."
end
end
class Array
include StrictDig
end
class Hash
include StrictDig
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment