From 767f100fd6b0099efe74434d284cceec8fc120bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw=20Barzowski?= Date: Tue, 18 Sep 2018 21:07:40 -0600 Subject: [PATCH] std.parseJson - a builtin for parsing json --- builtins.go | 16 ++++++++++++++++ testdata/parseJson.golden | 10 ++++++++++ testdata/parseJson.jsonnet | 12 ++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 testdata/parseJson.golden create mode 100644 testdata/parseJson.jsonnet diff --git a/builtins.go b/builtins.go index 9ccf332..0bcb1d2 100644 --- a/builtins.go +++ b/builtins.go @@ -20,6 +20,7 @@ import ( "bytes" "crypto/md5" "encoding/hex" + "encoding/json" "fmt" "math" "os" @@ -775,6 +776,20 @@ func builtinUglyObjectFlatMerge(i *interpreter, trace TraceElement, x value) (va ), nil } +func builtinParseJSON(i *interpreter, trace TraceElement, str value) (value, error) { + sval, err := i.getString(str, trace) + if err != nil { + return nil, err + } + s := sval.getString() + var parsedJSON interface{} + err = json.Unmarshal([]byte(s), &parsedJSON) + if err != nil { + return nil, i.Error(fmt.Sprintf("failed to parse JSON: %v", err.Error()), trace) + } + return jsonToValue(i, trace, parsedJSON) +} + func builtinExtVar(i *interpreter, trace TraceElement, name value) (value, error) { str, err := i.getString(name, trace) if err != nil { @@ -1000,6 +1015,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{ &binaryBuiltin{name: "modulo", function: builtinModulo, parameters: ast.Identifiers{"x", "y"}}, &unaryBuiltin{name: "md5", function: builtinMd5, parameters: ast.Identifiers{"x"}}, &ternaryBuiltin{name: "strReplace", function: builtinStrReplace, parameters: ast.Identifiers{"str", "from", "to"}}, + &unaryBuiltin{name: "parseJson", function: builtinParseJSON, parameters: ast.Identifiers{"str"}}, &unaryBuiltin{name: "native", function: builtinNative, parameters: ast.Identifiers{"x"}}, // internal diff --git a/testdata/parseJson.golden b/testdata/parseJson.golden new file mode 100644 index 0000000..4f28547 --- /dev/null +++ b/testdata/parseJson.golden @@ -0,0 +1,10 @@ +{ + "aaa": { }, + "foo": "bar", + "xxx": [ + 42, + "asdf", + { } + ], + "ąę": "ćż" +} diff --git a/testdata/parseJson.jsonnet b/testdata/parseJson.jsonnet new file mode 100644 index 0000000..567a0a1 --- /dev/null +++ b/testdata/parseJson.jsonnet @@ -0,0 +1,12 @@ +std.parseJson( + '{ + "foo": "bar", + "aaa": {}, + "ąę": "ćż", + "xxx": [ + 42, + "asdf", + {} + ] + }', +) \ No newline at end of file