diff --git a/builtins.go b/builtins.go index c37a1d7..bee1893 100644 --- a/builtins.go +++ b/builtins.go @@ -18,6 +18,8 @@ package jsonnet import ( "bytes" + "crypto/md5" + "encoding/hex" "math" "sort" @@ -373,6 +375,15 @@ func builtinType(e *evaluator, xp potentialValue) (value, error) { return makeValueString(x.typename()), nil } +func builtinMd5(e *evaluator, xp potentialValue) (value, error) { + x, err := e.evaluateString(xp) + if err != nil { + return nil, err + } + hash := md5.Sum([]byte(string(x.value))) + return makeValueString(hex.EncodeToString(hash[:])), nil +} + func makeDoubleCheck(e *evaluator, x float64) (value, error) { if math.IsNaN(x) { return nil, e.Error("Not a number") @@ -616,4 +627,5 @@ var funcBuiltins = map[string]evalCallable{ "exponent": &UnaryBuiltin{name: "exponent", function: builtinExponent, parameters: ast.Identifiers{"x"}}, "pow": &BinaryBuiltin{name: "pow", function: builtinPow, parameters: ast.Identifiers{"base", "exp"}}, "modulo": &BinaryBuiltin{name: "modulo", function: builtinModulo, parameters: ast.Identifiers{"x", "y"}}, + "md5": &UnaryBuiltin{name: "md5", function: builtinMd5, parameters: ast.Identifiers{"x"}}, } diff --git a/testdata/std.md5.golden b/testdata/std.md5.golden new file mode 100644 index 0000000..e929965 --- /dev/null +++ b/testdata/std.md5.golden @@ -0,0 +1 @@ +"f561aaf6ef0bf14d4208bb46a4ccb3ad" diff --git a/testdata/std.md5.input b/testdata/std.md5.input new file mode 100644 index 0000000..51960fc --- /dev/null +++ b/testdata/std.md5.input @@ -0,0 +1 @@ +std.md5("xxx") diff --git a/testdata/std.md5_2.golden b/testdata/std.md5_2.golden new file mode 100644 index 0000000..96c8aef --- /dev/null +++ b/testdata/std.md5_2.golden @@ -0,0 +1 @@ +"d41d8cd98f00b204e9800998ecf8427e" diff --git a/testdata/std.md5_2.input b/testdata/std.md5_2.input new file mode 100644 index 0000000..9e5f5fe --- /dev/null +++ b/testdata/std.md5_2.input @@ -0,0 +1 @@ +std.md5("") diff --git a/testdata/std.md5_3.golden b/testdata/std.md5_3.golden new file mode 100644 index 0000000..85b993a --- /dev/null +++ b/testdata/std.md5_3.golden @@ -0,0 +1 @@ +"0cc175b9c0f1b6a831c399e269772661" diff --git a/testdata/std.md5_3.input b/testdata/std.md5_3.input new file mode 100644 index 0000000..57ecc95 --- /dev/null +++ b/testdata/std.md5_3.input @@ -0,0 +1 @@ +std.md5("a") diff --git a/testdata/std.md5_4.golden b/testdata/std.md5_4.golden new file mode 100644 index 0000000..96a528e --- /dev/null +++ b/testdata/std.md5_4.golden @@ -0,0 +1 @@ +"f96b697d7cb7938d525a2f31aaf161d0" diff --git a/testdata/std.md5_4.input b/testdata/std.md5_4.input new file mode 100644 index 0000000..12f0571 --- /dev/null +++ b/testdata/std.md5_4.input @@ -0,0 +1 @@ +std.md5("message digest") diff --git a/testdata/std.md5_5.golden b/testdata/std.md5_5.golden new file mode 100644 index 0000000..cefd4ec --- /dev/null +++ b/testdata/std.md5_5.golden @@ -0,0 +1 @@ +"5786eab716295401c073064c3ec82a44" diff --git a/testdata/std.md5_5.input b/testdata/std.md5_5.input new file mode 100644 index 0000000..2f7bc68 --- /dev/null +++ b/testdata/std.md5_5.input @@ -0,0 +1 @@ +std.md5("ą") diff --git a/testdata/std.md5_6.golden b/testdata/std.md5_6.golden new file mode 100644 index 0000000..f94e054 --- /dev/null +++ b/testdata/std.md5_6.golden @@ -0,0 +1 @@ +RUNTIME ERROR: Unexpected type number, expected string diff --git a/testdata/std.md5_6.input b/testdata/std.md5_6.input new file mode 100644 index 0000000..2542a47 --- /dev/null +++ b/testdata/std.md5_6.input @@ -0,0 +1 @@ +std.md5(42)