diff --git a/builtins.go b/builtins.go index 5cc920f..c727175 100644 --- a/builtins.go +++ b/builtins.go @@ -1885,6 +1885,22 @@ func builtinNative(i *interpreter, name value) (value, error) { return &valueNull{}, nil } +func builtinSum(i *interpreter, arrv value) (value, error) { + arr, err := i.getArray(arrv) + if err != nil { + return nil, err + } + sum := 0.0 + for _, elem := range arr.elements { + elemValue, err := i.evaluateNumber(elem) + if err != nil { + return nil, err + } + sum += elemValue.value + } + return makeValueNumber(sum), nil +} + // Utils for builtins - TODO(sbarzowski) move to a separate file in another commit type builtin interface { @@ -2190,6 +2206,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{ &unaryBuiltin{name: "decodeUTF8", function: builtinDecodeUTF8, params: ast.Identifiers{"arr"}}, &generalBuiltin{name: "sort", function: builtinSort, params: []generalBuiltinParameter{{name: "arr"}, {name: "keyF", defaultValue: functionID}}}, &unaryBuiltin{name: "native", function: builtinNative, params: ast.Identifiers{"x"}}, + &unaryBuiltin{name: "sum", function: builtinSum, params: ast.Identifiers{"arr"}}, // internal &unaryBuiltin{name: "$objectFlatMerge", function: builtinUglyObjectFlatMerge, params: ast.Identifiers{"x"}}, diff --git a/linter/internal/types/stdlib.go b/linter/internal/types/stdlib.go index db8925d..2ad8bbe 100644 --- a/linter/internal/types/stdlib.go +++ b/linter/internal/types/stdlib.go @@ -137,6 +137,7 @@ func prepareStdlib(g *typeGraph) { "flattenArrays": g.newSimpleFuncType(anyArrayType, "arrs"), "sort": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}), "uniq": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}), + "sum": g.newSimpleFuncType(numberType, "arr"), // Sets diff --git a/testdata/builtinSum.golden b/testdata/builtinSum.golden new file mode 100644 index 0000000..1e8b314 --- /dev/null +++ b/testdata/builtinSum.golden @@ -0,0 +1 @@ +6 diff --git a/testdata/builtinSum.jsonnet b/testdata/builtinSum.jsonnet new file mode 100644 index 0000000..e011845 --- /dev/null +++ b/testdata/builtinSum.jsonnet @@ -0,0 +1 @@ +std.sum([1,2,3]) \ No newline at end of file diff --git a/testdata/builtinSum.linter.golden b/testdata/builtinSum.linter.golden new file mode 100644 index 0000000..e69de29