mirror of
https://github.com/google/go-jsonnet.git
synced 2025-09-29 01:11:02 +02:00
feat: implement std.remove and std.removeAt (#689)
* feat: implement std.remove and std.removeAt * Update builtins.go --------- Co-authored-by: Dave Cunningham <sparkprime@gmail.com>
This commit is contained in:
parent
3c7c0cbac8
commit
25d3372c98
37
builtins.go
37
builtins.go
@ -1990,6 +1990,41 @@ func builtinContains(i *interpreter, arrv value, ev value) (value, error) {
|
||||
return makeValueBoolean(false), nil
|
||||
}
|
||||
|
||||
func builtinRemove(i *interpreter, arrv value, ev value) (value, error) {
|
||||
arr, err := i.getArray(arrv)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for idx, 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 builtinRemoveAt(i, arrv, intToValue(idx))
|
||||
}
|
||||
}
|
||||
return arr, nil
|
||||
}
|
||||
|
||||
func builtinRemoveAt(i *interpreter, arrv value, idxv value) (value, error) {
|
||||
arr, err := i.getArray(arrv)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
idx, err := i.getInt(idxv)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
newArr := append(arr.elements[:idx], arr.elements[idx+1:]...)
|
||||
return makeValueArray(newArr), nil
|
||||
}
|
||||
|
||||
func builtInObjectRemoveKey(i *interpreter, objv value, keyv value) (value, error) {
|
||||
obj, err := i.getObject(objv)
|
||||
if err != nil {
|
||||
@ -2286,6 +2321,8 @@ var funcBuiltins = buildBuiltinMap([]builtin{
|
||||
&ternaryBuiltin{name: "foldl", function: builtinFoldl, params: ast.Identifiers{"func", "arr", "init"}},
|
||||
&ternaryBuiltin{name: "foldr", function: builtinFoldr, params: ast.Identifiers{"func", "arr", "init"}},
|
||||
&binaryBuiltin{name: "member", function: builtinMember, params: ast.Identifiers{"arr", "x"}},
|
||||
&binaryBuiltin{name: "remove", function: builtinRemove, params: ast.Identifiers{"arr", "elem"}},
|
||||
&binaryBuiltin{name: "removeAt", function: builtinRemoveAt, params: ast.Identifiers{"arr", "i"}},
|
||||
&binaryBuiltin{name: "range", function: builtinRange, params: ast.Identifiers{"from", "to"}},
|
||||
&binaryBuiltin{name: "primitiveEquals", function: primitiveEquals, params: ast.Identifiers{"x", "y"}},
|
||||
&binaryBuiltin{name: "equals", function: builtinEquals, params: ast.Identifiers{"x", "y"}},
|
||||
|
@ -142,6 +142,8 @@ func prepareStdlib(g *typeGraph) {
|
||||
"sum": g.newSimpleFuncType(numberType, "arr"),
|
||||
"minArray": g.newSimpleFuncType(anyType, "arr"),
|
||||
"contains": g.newSimpleFuncType(boolType, "arr", "elem"),
|
||||
"remove": g.newSimpleFuncType(anyArrayType, "arr", "elem"),
|
||||
"removeAt": g.newSimpleFuncType(anyArrayType, "arr", "i"),
|
||||
|
||||
// Sets
|
||||
|
||||
|
4
testdata/builtinRemove.golden
vendored
Normal file
4
testdata/builtinRemove.golden
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
[
|
||||
1,
|
||||
3
|
||||
]
|
1
testdata/builtinRemove.jsonnet
vendored
Normal file
1
testdata/builtinRemove.jsonnet
vendored
Normal file
@ -0,0 +1 @@
|
||||
std.remove([1,2,3],2)
|
0
testdata/builtinRemove.linter.golden
vendored
Normal file
0
testdata/builtinRemove.linter.golden
vendored
Normal file
4
testdata/builtinRemoveAt.golden
vendored
Normal file
4
testdata/builtinRemoveAt.golden
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
[
|
||||
1,
|
||||
3
|
||||
]
|
1
testdata/builtinRemoveAt.jsonnet
vendored
Normal file
1
testdata/builtinRemoveAt.jsonnet
vendored
Normal file
@ -0,0 +1 @@
|
||||
std.removeAt([1,2,3],1)
|
0
testdata/builtinRemoveAt.linter.golden
vendored
Normal file
0
testdata/builtinRemoveAt.linter.golden
vendored
Normal file
Loading…
x
Reference in New Issue
Block a user