mirror of
https://github.com/MontFerret/ferret.git
synced 2025-02-07 13:31:56 +02:00
24d8eedd4c
* Added release notes * #509 fixedOCOD typo * Updated values * Updated comments * Changed stdlib docs format * Changed format of array in docs * Use 'any' instead of 'value' in docs * New format for optional params * Updated docs for testing package * Added namespace information
74 lines
1.6 KiB
Go
74 lines
1.6 KiB
Go
package collections
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/MontFerret/ferret/pkg/runtime/core"
|
|
"github.com/MontFerret/ferret/pkg/runtime/values"
|
|
"github.com/MontFerret/ferret/pkg/runtime/values/types"
|
|
)
|
|
|
|
// INCLUDES checks whether a container includes a given value.
|
|
// @param {String | Any[] | Object | Iterable} haystack - The value container.
|
|
// @param {Any} needle - The target value to assert.
|
|
// @return {Boolean} - A boolean value that indicates whether a container contains a given value.
|
|
func Includes(ctx context.Context, args ...core.Value) (core.Value, error) {
|
|
err := core.ValidateArgs(args, 2, 2)
|
|
|
|
if err != nil {
|
|
return values.None, err
|
|
}
|
|
|
|
var result values.Boolean
|
|
haystack := args[0]
|
|
needle := args[1]
|
|
|
|
switch v := haystack.(type) {
|
|
case values.String:
|
|
result = v.Contains(values.NewString(needle.String()))
|
|
|
|
break
|
|
case *values.Array:
|
|
_, result = v.FindOne(func(value core.Value, _ int) bool {
|
|
return needle.Compare(value) == 0
|
|
})
|
|
|
|
break
|
|
case *values.Object:
|
|
_, result = v.Find(func(value core.Value, _ string) bool {
|
|
return needle.Compare(value) == 0
|
|
})
|
|
|
|
break
|
|
case core.Iterable:
|
|
iter, err := v.Iterate(ctx)
|
|
|
|
if err != nil {
|
|
return values.False, err
|
|
}
|
|
|
|
err = core.ForEach(ctx, iter, func(value core.Value, key core.Value) bool {
|
|
if needle.Compare(value) == 0 {
|
|
result = values.True
|
|
|
|
return false
|
|
}
|
|
|
|
return true
|
|
})
|
|
|
|
if err != nil {
|
|
return values.False, err
|
|
}
|
|
default:
|
|
return values.None, core.TypeError(haystack.Type(),
|
|
types.String,
|
|
types.Array,
|
|
types.Object,
|
|
core.NewType("Iterable"),
|
|
)
|
|
}
|
|
|
|
return result, nil
|
|
}
|