feat: implement std.contains (#691)

This commit is contained in:
Rohit Jangid 2023-05-03 23:36:07 +05:30 committed by GitHub
parent 7903819abf
commit 76e4fc2221
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 29 additions and 2 deletions

View File

@ -1935,6 +1935,27 @@ func builtinSum(i *interpreter, arrv value) (value, error) {
return makeValueNumber(sum), nil return makeValueNumber(sum), nil
} }
func builtinContains(i *interpreter, arrv value, ev value) (value, error) {
arr, err := i.getArray(arrv)
if err != nil {
return nil, err
}
for _, elem := range arr.elements {
val, err := elem.getValue(i)
if err != nil {
return nil, err
}
eq, err := rawEquals(i, val, ev)
if err != nil {
return nil, err
}
if eq {
return makeValueBoolean(true), nil
}
}
return makeValueBoolean(false), nil
}
// Utils for builtins - TODO(sbarzowski) move to a separate file in another commit // Utils for builtins - TODO(sbarzowski) move to a separate file in another commit
type builtin interface { type builtin interface {
@ -2245,6 +2266,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
&generalBuiltin{name: "sort", function: builtinSort, params: []generalBuiltinParameter{{name: "arr"}, {name: "keyF", defaultValue: functionID}}}, &generalBuiltin{name: "sort", function: builtinSort, params: []generalBuiltinParameter{{name: "arr"}, {name: "keyF", defaultValue: functionID}}},
&unaryBuiltin{name: "native", function: builtinNative, params: ast.Identifiers{"x"}}, &unaryBuiltin{name: "native", function: builtinNative, params: ast.Identifiers{"x"}},
&unaryBuiltin{name: "sum", function: builtinSum, params: ast.Identifiers{"arr"}}, &unaryBuiltin{name: "sum", function: builtinSum, params: ast.Identifiers{"arr"}},
&binaryBuiltin{name: "contains", function: builtinContains, params: ast.Identifiers{"arr", "elem"}},
// internal // internal
&unaryBuiltin{name: "$objectFlatMerge", function: builtinUglyObjectFlatMerge, params: ast.Identifiers{"x"}}, &unaryBuiltin{name: "$objectFlatMerge", function: builtinUglyObjectFlatMerge, params: ast.Identifiers{"x"}},

View File

@ -140,6 +140,7 @@ func prepareStdlib(g *typeGraph) {
"sort": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}), "sort": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}),
"uniq": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}), "uniq": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}),
"sum": g.newSimpleFuncType(numberType, "arr"), "sum": g.newSimpleFuncType(numberType, "arr"),
"contains": g.newSimpleFuncType(boolType, "arr", "elem"),
// Sets // Sets
@ -176,8 +177,8 @@ func prepareStdlib(g *typeGraph) {
// Boolean // Boolean
"xor": g.newSimpleFuncType(boolType, "x", "y"), "xor": g.newSimpleFuncType(boolType, "x", "y"),
"xnor": g.newSimpleFuncType(boolType, "x", "y"), "xnor": g.newSimpleFuncType(boolType, "x", "y"),
} }
fieldContains := map[string][]placeholderID{} fieldContains := map[string][]placeholderID{}

1
testdata/builtinContains.golden vendored Normal file
View File

@ -0,0 +1 @@
true

1
testdata/builtinContains.jsonnet vendored Normal file
View File

@ -0,0 +1 @@
std.contains([1, 2, 3], 2)

View File

1
testdata/builtinContains2.golden vendored Normal file
View File

@ -0,0 +1 @@
false

1
testdata/builtinContains2.jsonnet vendored Normal file
View File

@ -0,0 +1 @@
std.contains([1, 2, 3], "foo")

View File