Skip to content

Commit 76e4fc2

Browse files
authored
feat: implement std.contains (#691)
1 parent 7903819 commit 76e4fc2

File tree

8 files changed

+29
-2
lines changed

8 files changed

+29
-2
lines changed

builtins.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1935,6 +1935,27 @@ func builtinSum(i *interpreter, arrv value) (value, error) {
19351935
return makeValueNumber(sum), nil
19361936
}
19371937

1938+
func builtinContains(i *interpreter, arrv value, ev value) (value, error) {
1939+
arr, err := i.getArray(arrv)
1940+
if err != nil {
1941+
return nil, err
1942+
}
1943+
for _, elem := range arr.elements {
1944+
val, err := elem.getValue(i)
1945+
if err != nil {
1946+
return nil, err
1947+
}
1948+
eq, err := rawEquals(i, val, ev)
1949+
if err != nil {
1950+
return nil, err
1951+
}
1952+
if eq {
1953+
return makeValueBoolean(true), nil
1954+
}
1955+
}
1956+
return makeValueBoolean(false), nil
1957+
}
1958+
19381959
// Utils for builtins - TODO(sbarzowski) move to a separate file in another commit
19391960

19401961
type builtin interface {
@@ -2245,6 +2266,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
22452266
&generalBuiltin{name: "sort", function: builtinSort, params: []generalBuiltinParameter{{name: "arr"}, {name: "keyF", defaultValue: functionID}}},
22462267
&unaryBuiltin{name: "native", function: builtinNative, params: ast.Identifiers{"x"}},
22472268
&unaryBuiltin{name: "sum", function: builtinSum, params: ast.Identifiers{"arr"}},
2269+
&binaryBuiltin{name: "contains", function: builtinContains, params: ast.Identifiers{"arr", "elem"}},
22482270

22492271
// internal
22502272
&unaryBuiltin{name: "$objectFlatMerge", function: builtinUglyObjectFlatMerge, params: ast.Identifiers{"x"}},

linter/internal/types/stdlib.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ func prepareStdlib(g *typeGraph) {
140140
"sort": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}),
141141
"uniq": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}),
142142
"sum": g.newSimpleFuncType(numberType, "arr"),
143+
"contains": g.newSimpleFuncType(boolType, "arr", "elem"),
143144

144145
// Sets
145146

@@ -176,8 +177,8 @@ func prepareStdlib(g *typeGraph) {
176177

177178
// Boolean
178179

179-
"xor": g.newSimpleFuncType(boolType, "x", "y"),
180-
"xnor": g.newSimpleFuncType(boolType, "x", "y"),
180+
"xor": g.newSimpleFuncType(boolType, "x", "y"),
181+
"xnor": g.newSimpleFuncType(boolType, "x", "y"),
181182
}
182183

183184
fieldContains := map[string][]placeholderID{}

testdata/builtinContains.golden

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
true

testdata/builtinContains.jsonnet

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
std.contains([1, 2, 3], 2)

testdata/builtinContains.linter.golden

Whitespace-only changes.

testdata/builtinContains2.golden

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
false

testdata/builtinContains2.jsonnet

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
std.contains([1, 2, 3], "foo")

testdata/builtinContains2.linter.golden

Whitespace-only changes.

0 commit comments

Comments
 (0)