From 25d3372c986ee2be696746e9dcc7b0996258cdcd Mon Sep 17 00:00:00 2001 From: Rohit Jangid Date: Thu, 25 May 2023 18:02:21 +0530 Subject: [PATCH] feat: implement std.remove and std.removeAt (#689) * feat: implement std.remove and std.removeAt * Update builtins.go --------- Co-authored-by: Dave Cunningham --- builtins.go | 37 ++++++++++++++++++++++++++ linter/internal/types/stdlib.go | 2 ++ testdata/builtinRemove.golden | 4 +++ testdata/builtinRemove.jsonnet | 1 + testdata/builtinRemove.linter.golden | 0 testdata/builtinRemoveAt.golden | 4 +++ testdata/builtinRemoveAt.jsonnet | 1 + testdata/builtinRemoveAt.linter.golden | 0 8 files changed, 49 insertions(+) create mode 100644 testdata/builtinRemove.golden create mode 100644 testdata/builtinRemove.jsonnet create mode 100644 testdata/builtinRemove.linter.golden create mode 100644 testdata/builtinRemoveAt.golden create mode 100644 testdata/builtinRemoveAt.jsonnet create mode 100644 testdata/builtinRemoveAt.linter.golden diff --git a/builtins.go b/builtins.go index 10b180f..fc3313a 100644 --- a/builtins.go +++ b/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"}}, diff --git a/linter/internal/types/stdlib.go b/linter/internal/types/stdlib.go index 6d00798..8ec3738 100644 --- a/linter/internal/types/stdlib.go +++ b/linter/internal/types/stdlib.go @@ -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 diff --git a/testdata/builtinRemove.golden b/testdata/builtinRemove.golden new file mode 100644 index 0000000..7ccaaf6 --- /dev/null +++ b/testdata/builtinRemove.golden @@ -0,0 +1,4 @@ +[ + 1, + 3 +] diff --git a/testdata/builtinRemove.jsonnet b/testdata/builtinRemove.jsonnet new file mode 100644 index 0000000..e9f5487 --- /dev/null +++ b/testdata/builtinRemove.jsonnet @@ -0,0 +1 @@ +std.remove([1,2,3],2) \ No newline at end of file diff --git a/testdata/builtinRemove.linter.golden b/testdata/builtinRemove.linter.golden new file mode 100644 index 0000000..e69de29 diff --git a/testdata/builtinRemoveAt.golden b/testdata/builtinRemoveAt.golden new file mode 100644 index 0000000..7ccaaf6 --- /dev/null +++ b/testdata/builtinRemoveAt.golden @@ -0,0 +1,4 @@ +[ + 1, + 3 +] diff --git a/testdata/builtinRemoveAt.jsonnet b/testdata/builtinRemoveAt.jsonnet new file mode 100644 index 0000000..1961464 --- /dev/null +++ b/testdata/builtinRemoveAt.jsonnet @@ -0,0 +1 @@ +std.removeAt([1,2,3],1) \ No newline at end of file diff --git a/testdata/builtinRemoveAt.linter.golden b/testdata/builtinRemoveAt.linter.golden new file mode 100644 index 0000000..e69de29