mirror of
https://github.com/google/go-jsonnet.git
synced 2025-08-13 09:47:13 +02:00
parent
76e4fc2221
commit
9c0b362ba7
37
builtins.go
37
builtins.go
@ -1907,6 +1907,42 @@ func builtinExtVar(i *interpreter, name value) (value, error) {
|
|||||||
return nil, i.Error("Undefined external variable: " + string(index))
|
return nil, i.Error("Undefined external variable: " + string(index))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func builtinMinArray(i *interpreter, arguments []value) (value, error) {
|
||||||
|
arrv := arguments[0]
|
||||||
|
keyFv := arguments[1]
|
||||||
|
|
||||||
|
arr, err := i.getArray(arrv)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
keyF, err := i.getFunction(keyFv)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
num := arr.length()
|
||||||
|
if num == 0 {
|
||||||
|
return nil, i.Error("Expected at least one element in array. Got none")
|
||||||
|
}
|
||||||
|
minVal, err := keyF.call(i, args(arr.elements[0]))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for index := 1; index < num; index++ {
|
||||||
|
current, err := keyF.call(i, args(arr.elements[index]))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
cmp, err := valueCmp(i, minVal, current)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if cmp > 0 {
|
||||||
|
minVal = current
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return minVal, nil
|
||||||
|
}
|
||||||
|
|
||||||
func builtinNative(i *interpreter, name value) (value, error) {
|
func builtinNative(i *interpreter, name value) (value, error) {
|
||||||
str, err := i.getString(name)
|
str, err := i.getString(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -2264,6 +2300,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
|
|||||||
&unaryBuiltin{name: "encodeUTF8", function: builtinEncodeUTF8, params: ast.Identifiers{"str"}},
|
&unaryBuiltin{name: "encodeUTF8", function: builtinEncodeUTF8, params: ast.Identifiers{"str"}},
|
||||||
&unaryBuiltin{name: "decodeUTF8", function: builtinDecodeUTF8, params: ast.Identifiers{"arr"}},
|
&unaryBuiltin{name: "decodeUTF8", function: builtinDecodeUTF8, params: ast.Identifiers{"arr"}},
|
||||||
&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}}},
|
||||||
|
&generalBuiltin{name: "minArray", function: builtinMinArray, 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"}},
|
&binaryBuiltin{name: "contains", function: builtinContains, params: ast.Identifiers{"arr", "elem"}},
|
||||||
|
@ -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"),
|
||||||
|
"minArray": g.newSimpleFuncType(anyType, "arr"),
|
||||||
"contains": g.newSimpleFuncType(boolType, "arr", "elem"),
|
"contains": g.newSimpleFuncType(boolType, "arr", "elem"),
|
||||||
|
|
||||||
// Sets
|
// Sets
|
||||||
|
1
testdata/builtinMinArray.golden
vendored
Normal file
1
testdata/builtinMinArray.golden
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
-1
|
1
testdata/builtinMinArray.jsonnet
vendored
Normal file
1
testdata/builtinMinArray.jsonnet
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
std.minArray([1,-1,0])
|
0
testdata/builtinMinArray.linter.golden
vendored
Normal file
0
testdata/builtinMinArray.linter.golden
vendored
Normal file
Loading…
Reference in New Issue
Block a user