Skip to content

Commit 86798a6

Browse files
committed
fix: handle string pointer in fromJSON builtin
Support *string input in fromJSON builtin function by dereferencing pointer before JSON unmarshaling. Added tests covering both direct string and pointer string use cases, including toJSON, which already supports this. Signed-off-by: Ville Vesilehto <[email protected]>
1 parent 192ab82 commit 86798a6

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

builtin/builtin.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,11 @@ var Builtins = []*Function{
443443
Name: "fromJSON",
444444
Func: func(args ...any) (any, error) {
445445
var v any
446-
err := json.Unmarshal([]byte(args[0].(string)), &v)
446+
jsonStr := args[0]
447+
if strPtr, ok := jsonStr.(*string); ok {
448+
jsonStr = *strPtr
449+
}
450+
err := json.Unmarshal([]byte(jsonStr.(string)), &v)
447451
if err != nil {
448452
return nil, err
449453
}

builtin/builtin_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,3 +638,55 @@ func Test_int_unwraps_underlying_value(t *testing.T) {
638638
require.NoError(t, err)
639639
assert.Equal(t, true, out)
640640
}
641+
642+
func TestBuiltin_json(t *testing.T) {
643+
t.Run("fromJSON/string", func(t *testing.T) {
644+
env := map[string]any{
645+
"json": `{"foo": "bar"}`,
646+
}
647+
program, err := expr.Compile(`fromJSON(json)`, expr.Env(env))
648+
require.NoError(t, err)
649+
650+
out, err := expr.Run(program, env)
651+
require.NoError(t, err)
652+
assert.Equal(t, map[string]any{"foo": "bar"}, out)
653+
})
654+
655+
t.Run("fromJSON/string pointer", func(t *testing.T) {
656+
jsonString := `{"foo": "bar"}`
657+
env := map[string]any{
658+
"json": &jsonString,
659+
}
660+
program, err := expr.Compile(`fromJSON(json)`, expr.Env(env))
661+
require.NoError(t, err)
662+
663+
out, err := expr.Run(program, env)
664+
require.NoError(t, err)
665+
assert.Equal(t, map[string]any{"foo": "bar"}, out)
666+
})
667+
668+
t.Run("toJSON/object", func(t *testing.T) {
669+
env := map[string]any{
670+
"obj": map[string]any{"foo": "bar"},
671+
}
672+
program, err := expr.Compile(`toJSON(obj)`, expr.Env(env))
673+
require.NoError(t, err)
674+
675+
out, err := expr.Run(program, env)
676+
require.NoError(t, err)
677+
assert.Equal(t, "{\n \"foo\": \"bar\"\n}", out)
678+
})
679+
680+
t.Run("toJSON/object pointer", func(t *testing.T) {
681+
obj := map[string]any{"foo": "bar"}
682+
env := map[string]any{
683+
"obj": &obj,
684+
}
685+
program, err := expr.Compile(`toJSON(obj)`, expr.Env(env))
686+
require.NoError(t, err)
687+
688+
out, err := expr.Run(program, env)
689+
require.NoError(t, err)
690+
assert.Equal(t, "{\n \"foo\": \"bar\"\n}", out)
691+
})
692+
}

0 commit comments

Comments
 (0)