mirror of
https://github.com/google/go-jsonnet.git
synced 2025-09-28 17:01:02 +02:00
feat: implement std.contains (#691)
This commit is contained in:
parent
7903819abf
commit
76e4fc2221
22
builtins.go
22
builtins.go
@ -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"}},
|
||||||
|
@ -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
1
testdata/builtinContains.golden
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
true
|
1
testdata/builtinContains.jsonnet
vendored
Normal file
1
testdata/builtinContains.jsonnet
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
std.contains([1, 2, 3], 2)
|
0
testdata/builtinContains.linter.golden
vendored
Normal file
0
testdata/builtinContains.linter.golden
vendored
Normal file
1
testdata/builtinContains2.golden
vendored
Normal file
1
testdata/builtinContains2.golden
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
false
|
1
testdata/builtinContains2.jsonnet
vendored
Normal file
1
testdata/builtinContains2.jsonnet
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
std.contains([1, 2, 3], "foo")
|
0
testdata/builtinContains2.linter.golden
vendored
Normal file
0
testdata/builtinContains2.linter.golden
vendored
Normal file
Loading…
x
Reference in New Issue
Block a user