class ReeHash::Slice
def call(hash, keys, **opts)
def call(hash, keys, **opts) filter_keys = build_filter_keys(keys) recursively_slice(hash, filter_keys, !!opts[:raise]) end
def recursively_slice(hash, filter_keys, raise_if_missing)
def recursively_slice(hash, filter_keys, raise_if_missing) result = {} filter_keys.each do |filter_k, filter_v| if !hash.has_key?(filter_k) if raise_if_missing raise MissingKeyErr.new("missing key `#{filter_k.inspect}`") else next end end value = hash[filter_k] if filter_v.empty? result[filter_k] = value next end if value.is_a?(Array) result[filter_k] = value.map do |v| if v.is_a?(Hash) recursively_slice(v, filter_v, raise_if_missing) else raise InvalidFilterKey.new("invalid filter key #{filter_v.inspect} for value: #{v.inspect}") end end elsif value.is_a?(Hash) result[filter_k] = recursively_slice(value, filter_v, raise_if_missing) else raise InvalidFilterKey.new("invalid filter key #{filter_v.inspect} for value: #{value.inspect}") end end result end