Skip to content

Commit

Permalink
objects: add RemarshJSONReflect
Browse files Browse the repository at this point in the history
  • Loading branch information
5aaee9 committed Jun 7, 2023
1 parent 7f1a8c7 commit 2701698
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 1 deletion.
44 changes: 43 additions & 1 deletion pkgs/objects/json.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package objects

import "encoding/json"
import (
"encoding/json"
"errors"
"reflect"
)

func RemarshJSON[T any](input any) (*T, error) {
bytes, err := json.Marshal(input)
Expand All @@ -15,3 +19,41 @@ func RemarshJSON[T any](input any) (*T, error) {

return r, nil
}

var ErrTypeError = errors.New("type error")

func RemarshJSONReflect[T any](input any, kind reflect.Type) (*T, error) {
data, err := json.Marshal(input)
if err != nil {
return nil, err
}

if kind.Kind() == reflect.Ptr {
typ := kind.Elem()
dst := reflect.New(typ).Elem()
err := json.Unmarshal(data, dst.Addr().Interface())
if err != nil {
return nil, err
}

res, ok := dst.Addr().Interface().(*T)
if !ok {
return nil, ErrTypeError
}

return res, nil
}

dst := reflect.New(kind).Elem()
err = json.Unmarshal(data, dst.Addr().Interface())
if err != nil {
return nil, err
}

res, ok := dst.Interface().(T)
if !ok {
return nil, ErrTypeError
}

return &res, nil
}
19 changes: 19 additions & 0 deletions pkgs/objects/json_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package objects_test

import (
"reflect"
"testing"

"github.com/5aaee9/utils/pkgs/json"
Expand All @@ -20,3 +21,21 @@ func TestRemarshJSON(t *testing.T) {
assert.NoError(t, err)
assert.Equal(t, out.Data, "data test #1")
}

func TestRemarshJSONReflect(t *testing.T) {
out, err := objects.RemarshJSONReflect[TestStruct](json.JSON{
"test": "data test #1",
}, reflect.TypeOf(TestStruct{}))

assert.NoError(t, err)
assert.Equal(t, out.Data, "data test #1")

ptr := new(TestStruct)

out, err = objects.RemarshJSONReflect[TestStruct](json.JSON{
"test": "data test #1",
}, reflect.ValueOf(ptr).Type())
assert.NoError(t, err)
assert.Equal(t, out.Data, "data test #1")
assert.Equal(t, ptr.Data, "")
}

0 comments on commit 2701698

Please sign in to comment.