@@ -19,6 +19,9 @@ package jsonnet
19
19
import (
20
20
"bytes"
21
21
"crypto/md5"
22
+ "crypto/sha1"
23
+ "crypto/sha256"
24
+ "crypto/sha512"
22
25
"encoding/base64"
23
26
"encoding/hex"
24
27
"encoding/json"
@@ -31,6 +34,7 @@ import (
31
34
"strings"
32
35
33
36
"github.com/google/go-jsonnet/ast"
37
+ "golang.org/x/crypto/sha3"
34
38
)
35
39
36
40
func builtinPlus (i * interpreter , x , y value ) (value , error ) {
@@ -916,6 +920,42 @@ func builtinMd5(i *interpreter, x value) (value, error) {
916
920
return makeValueString (hex .EncodeToString (hash [:])), nil
917
921
}
918
922
923
+ func builtinSha1 (i * interpreter , x value ) (value , error ) {
924
+ str , err := i .getString (x )
925
+ if err != nil {
926
+ return nil , err
927
+ }
928
+ hash := sha1 .Sum ([]byte (str .getGoString ()))
929
+ return makeValueString (hex .EncodeToString (hash [:])), nil
930
+ }
931
+
932
+ func builtinSha256 (i * interpreter , x value ) (value , error ) {
933
+ str , err := i .getString (x )
934
+ if err != nil {
935
+ return nil , err
936
+ }
937
+ hash := sha256 .Sum256 ([]byte (str .getGoString ()))
938
+ return makeValueString (hex .EncodeToString (hash [:])), nil
939
+ }
940
+
941
+ func builtinSha512 (i * interpreter , x value ) (value , error ) {
942
+ str , err := i .getString (x )
943
+ if err != nil {
944
+ return nil , err
945
+ }
946
+ hash := sha512 .Sum512 ([]byte (str .getGoString ()))
947
+ return makeValueString (hex .EncodeToString (hash [:])), nil
948
+ }
949
+
950
+ func builtinSha3 (i * interpreter , x value ) (value , error ) {
951
+ str , err := i .getString (x )
952
+ if err != nil {
953
+ return nil , err
954
+ }
955
+ hash := sha3 .Sum512 ([]byte (str .getGoString ()))
956
+ return makeValueString (hex .EncodeToString (hash [:])), nil
957
+ }
958
+
919
959
func builtinBase64 (i * interpreter , input value ) (value , error ) {
920
960
var byteArr []byte
921
961
@@ -1327,6 +1367,15 @@ func builtinEqualsIgnoreCase(i *interpreter, sv1, sv2 value) (value, error) {
1327
1367
return makeValueBoolean (strings .EqualFold (s1 .getGoString (), s2 .getGoString ())), nil
1328
1368
}
1329
1369
1370
+ func builtinTrim (i * interpreter , strv value ) (value , error ) {
1371
+ str , err := i .getString (strv )
1372
+ if err != nil {
1373
+ return nil , err
1374
+ }
1375
+ sStr := str .getGoString ()
1376
+ return makeValueString (strings .TrimSpace (sStr )), nil
1377
+ }
1378
+
1330
1379
func base64DecodeGoBytes (i * interpreter , str string ) ([]byte , error ) {
1331
1380
strLen := len (str )
1332
1381
if strLen % 4 != 0 {
@@ -2043,6 +2092,30 @@ func builtinSum(i *interpreter, arrv value) (value, error) {
2043
2092
return makeValueNumber (sum ), nil
2044
2093
}
2045
2094
2095
+ func builtinAvg (i * interpreter , arrv value ) (value , error ) {
2096
+ arr , err := i .getArray (arrv )
2097
+ if err != nil {
2098
+ return nil , err
2099
+ }
2100
+
2101
+ len := float64 (arr .length ())
2102
+ if len == 0 {
2103
+ return nil , i .Error ("Cannot calculate average of an empty array." )
2104
+ }
2105
+
2106
+ sumValue , err := builtinSum (i , arrv )
2107
+ if err != nil {
2108
+ return nil , err
2109
+ }
2110
+ sum , err := i .getNumber (sumValue )
2111
+ if err != nil {
2112
+ return nil , err
2113
+ }
2114
+
2115
+ avg := sum .value / len
2116
+ return makeValueNumber (avg ), nil
2117
+ }
2118
+
2046
2119
func builtinContains (i * interpreter , arrv value , ev value ) (value , error ) {
2047
2120
arr , err := i .getArray (arrv )
2048
2121
if err != nil {
@@ -2427,6 +2500,10 @@ var funcBuiltins = buildBuiltinMap([]builtin{
2427
2500
& binaryBuiltin {name : "pow" , function : builtinPow , params : ast.Identifiers {"x" , "n" }},
2428
2501
& binaryBuiltin {name : "modulo" , function : builtinModulo , params : ast.Identifiers {"x" , "y" }},
2429
2502
& unaryBuiltin {name : "md5" , function : builtinMd5 , params : ast.Identifiers {"s" }},
2503
+ & unaryBuiltin {name : "sha1" , function : builtinSha1 , params : ast.Identifiers {"s" }},
2504
+ & unaryBuiltin {name : "sha256" , function : builtinSha256 , params : ast.Identifiers {"s" }},
2505
+ & unaryBuiltin {name : "sha512" , function : builtinSha512 , params : ast.Identifiers {"s" }},
2506
+ & unaryBuiltin {name : "sha3" , function : builtinSha3 , params : ast.Identifiers {"s" }},
2430
2507
& binaryBuiltin {name : "xnor" , function : builtinXnor , params : ast.Identifiers {"x" , "y" }},
2431
2508
& binaryBuiltin {name : "xor" , function : builtinXor , params : ast.Identifiers {"x" , "y" }},
2432
2509
& binaryBuiltin {name : "lstripChars" , function : builtinLstripChars , params : ast.Identifiers {"str" , "chars" }},
@@ -2437,6 +2514,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
2437
2514
& ternaryBuiltin {name : "strReplace" , function : builtinStrReplace , params : ast.Identifiers {"str" , "from" , "to" }},
2438
2515
& unaryBuiltin {name : "isEmpty" , function : builtinIsEmpty , params : ast.Identifiers {"str" }},
2439
2516
& binaryBuiltin {name : "equalsIgnoreCase" , function : builtinEqualsIgnoreCase , params : ast.Identifiers {"str1" , "str2" }},
2517
+ & unaryBuiltin {name : "trim" , function : builtinTrim , params : ast.Identifiers {"str" }},
2440
2518
& unaryBuiltin {name : "base64Decode" , function : builtinBase64Decode , params : ast.Identifiers {"str" }},
2441
2519
& unaryBuiltin {name : "base64DecodeBytes" , function : builtinBase64DecodeBytes , params : ast.Identifiers {"str" }},
2442
2520
& unaryBuiltin {name : "parseInt" , function : builtinParseInt , params : ast.Identifiers {"str" }},
@@ -2454,6 +2532,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
2454
2532
& generalBuiltin {name : "maxArray" , function : builtinMaxArray , params : []generalBuiltinParameter {{name : "arr" }, {name : "keyF" , defaultValue : functionID }}},
2455
2533
& unaryBuiltin {name : "native" , function : builtinNative , params : ast.Identifiers {"x" }},
2456
2534
& unaryBuiltin {name : "sum" , function : builtinSum , params : ast.Identifiers {"arr" }},
2535
+ & unaryBuiltin {name : "avg" , function : builtinAvg , params : ast.Identifiers {"arr" }},
2457
2536
& binaryBuiltin {name : "contains" , function : builtinContains , params : ast.Identifiers {"arr" , "elem" }},
2458
2537
2459
2538
// internal
0 commit comments