Sha256: a8cff8eecb4c62369a0b1187911c7bab9f364d5e83f2bb7f591c3a9b161467c8
Contents?: true
Size: 1.16 KB
Versions: 1
Compression:
Stored size: 1.16 KB
Contents
# frozen_string_literal: true require 'kind/basic' require 'kind/empty' require 'kind/presence' module Kind module Dig extend self def call!(data, keys = Empty::ARRAY) # :nodoc keys.reduce(data) do |memo, key| value = get(memo, key) break if KIND.null?(value) value end end def call(data, *input) args = input.size == 1 && input[0].kind_of?(::Array) ? input[0] : input result = call!(data, args) return result unless block_given? yield(result) unless KIND.null?(result) end def presence(*args, &block) Presence.(call(*args, &block)) end def [](*keys) ->(data) { call!(data, keys) } end private def get(data, key) return data[key] if ::Hash === data case data when ::Array data[key] if key.respond_to?(:to_int) when ::OpenStruct data[key] if key.respond_to?(:to_sym) when ::Struct data[key] rescue nil if key.respond_to?(:to_int) || key.respond_to?(:to_sym) else data.public_send(key) if key.respond_to?(:to_sym) && data.respond_to?(key) end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
kind-5.2.0 | lib/kind/dig.rb |