From bc17b8841e8955ef9e65a373295acec73fef44cd Mon Sep 17 00:00:00 2001 From: George BV Date: Tue, 30 Jun 2020 14:30:36 +0600 Subject: [PATCH] feat(utils/unmarshal): Added support simple struct (without custom Unmarshaler) --- util/util.go | 7 ++++++- util/util_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/util/util.go b/util/util.go index 185b989..b235b1c 100644 --- a/util/util.go +++ b/util/util.go @@ -142,7 +142,12 @@ func Unmarshal(x starlark.Value) (val interface{}, err error) { } val = _var } else { - err = fmt.Errorf("constructor object from *starlarkstruct.Struct not supported Marshaler to starlark object: %s", v.Constructor().Type()) + dict := new(starlark.Dict) + for _, name := range v.AttrNames() { + val, _ := v.Attr(name) + dict.SetKey(starlark.String(name), val) + } + val, err = Unmarshal(dict) } default: fmt.Println("errbadtype:", x.Type()) diff --git a/util/util_test.go b/util/util_test.go index 8b99c06..d7280fa 100644 --- a/util/util_test.go +++ b/util/util_test.go @@ -108,6 +108,22 @@ func TestUnmarshal(t *testing.T) { strDictCT.SetKey(starlark.String("foo"), starlark.MakeInt(42)) strDictCT.SetKey(starlark.String("bar"), ct) + strDict2 := make(starlark.StringDict) + strDict2["int"] = starlark.MakeInt(42) + strDict2["ct"] = ct + strDict2["int_dict"] = intDict + strDict2["dict_with_ct"] = strDictCT + + struct1 := starlarkstruct.FromStringDict(starlarkstruct.Default, starlark.StringDict{ + "int": starlark.MakeInt(42), + "ct": ct, + "int_dict": intDict, + "dict_with_ct": strDictCT, + }) + struct2 := starlarkstruct.FromStringDict(starlarkstruct.Default, starlark.StringDict{ + "struct": struct1, + }) + cases := []struct { in starlark.Value want interface{} @@ -134,6 +150,14 @@ func TestUnmarshal(t *testing.T) { {ct, &customType{42}, ""}, {strDictCT, map[string]interface{}{"foo": 42, "bar": &customType{42}}, ""}, {starlark.NewList([]starlark.Value{starlark.MakeInt(42), ct}), []interface{}{42, &customType{42}}, ""}, + {struct2, map[string]interface{}{ + "struct": map[string]interface{}{ + "int": 42, + "ct": &customType{42}, + "int_dict": map[interface{}]interface{}{42 * 2: 42}, + "dict_with_ct": map[string]interface{}{"foo": 42, "bar": &customType{42}}, + }, + }, ""}, } for i, c := range cases {