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