in lib/collections.go [913:963]
func hasFieldPath(arg ref.Val, path types.String) bool {
switch obj := arg.(type) {
case traits.Lister:
it := obj.Iterator()
for it.HasNext() == types.True {
if hasFieldPath(it.Next(), path) {
return true
}
}
return false
case traits.Mapper:
dotIdx, escaped := pathSepIndex(string(path))
switch {
case dotIdx == 0, dotIdx == len(path)-1:
panic(types.NewErr("invalid parameter path for drop: %s", path))
case dotIdx < 0:
m, err := obj.ConvertToNative(refValMap)
if err != nil {
panic(types.NewErr("unable to convert map to native: %v", err))
}
for k := range m.(map[ref.Val]ref.Val) {
if k.Equal(path) == types.True {
return true
}
}
return false
default:
m, err := obj.ConvertToNative(refValMap)
if err != nil {
panic(types.NewErr("unable to convert map to native: %v", err))
}
head := path[:dotIdx]
if escaped {
head = types.String(strings.ReplaceAll(string(head), `\.`, "."))
}
tail := path[dotIdx+1:]
for k, v := range m.(map[ref.Val]ref.Val) {
if k.Equal(head) == types.True {
return hasFieldPath(v, tail)
}
}
return false
}
default:
return false
}
}