github.com/MontFerret/ferret@v0.18.0/pkg/stdlib/collections/include.go (about) 1 package collections 2 3 import ( 4 "context" 5 6 "github.com/MontFerret/ferret/pkg/runtime/core" 7 "github.com/MontFerret/ferret/pkg/runtime/values" 8 "github.com/MontFerret/ferret/pkg/runtime/values/types" 9 ) 10 11 // INCLUDES checks whether a container includes a given value. 12 // @param {String | Any[] | Object | Iterable} haystack - The value container. 13 // @param {Any} needle - The target value to assert. 14 // @return {Boolean} - A boolean value that indicates whether a container contains a given value. 15 func Includes(ctx context.Context, args ...core.Value) (core.Value, error) { 16 err := core.ValidateArgs(args, 2, 2) 17 18 if err != nil { 19 return values.None, err 20 } 21 22 var result values.Boolean 23 haystack := args[0] 24 needle := args[1] 25 26 switch v := haystack.(type) { 27 case values.String: 28 result = v.Contains(values.NewString(needle.String())) 29 30 break 31 case *values.Array: 32 _, result = v.FindOne(func(value core.Value, _ int) bool { 33 return needle.Compare(value) == 0 34 }) 35 36 break 37 case *values.Object: 38 _, result = v.Find(func(value core.Value, _ string) bool { 39 return needle.Compare(value) == 0 40 }) 41 42 break 43 case core.Iterable: 44 iter, err := v.Iterate(ctx) 45 46 if err != nil { 47 return values.False, err 48 } 49 50 err = core.ForEach(ctx, iter, func(value core.Value, key core.Value) bool { 51 if needle.Compare(value) == 0 { 52 result = values.True 53 54 return false 55 } 56 57 return true 58 }) 59 60 if err != nil { 61 return values.False, err 62 } 63 default: 64 return values.None, core.TypeError(haystack.Type(), 65 types.String, 66 types.Array, 67 types.Object, 68 core.NewType("Iterable"), 69 ) 70 } 71 72 return result, nil 73 }