func hasFieldPath()

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
	}
}