- add convert any type to ToStringMapE

This commit is contained in:
Sippakorn Raksakiart 2019-11-04 19:10:43 +07:00
parent c01685bb84
commit d0ef62fd94
2 changed files with 17 additions and 3 deletions

View File

@ -761,10 +761,14 @@ func TestToStringMapE(t *testing.T) {
{map[string]interface{}{"tag": "tags", "group": "groups"}, map[string]interface{}{"tag": "tags", "group": "groups"}, false}, {map[string]interface{}{"tag": "tags", "group": "groups"}, map[string]interface{}{"tag": "tags", "group": "groups"}, false},
{`{"tag": "tags", "group": "groups"}`, map[string]interface{}{"tag": "tags", "group": "groups"}, false}, {`{"tag": "tags", "group": "groups"}`, map[string]interface{}{"tag": "tags", "group": "groups"}, false},
{`{"tag": "tags", "group": true}`, map[string]interface{}{"tag": "tags", "group": true}, false}, {`{"tag": "tags", "group": true}`, map[string]interface{}{"tag": "tags", "group": true}, false},
{struct {
Hello string
}{
Hello: "World",
}, map[string]interface{}{"Hello": "World"}, false},
{testing.T{}, map[string]interface{}{}, false},
// errors // errors
{nil, nil, true}, {nil, nil, true},
{testing.T{}, nil, true},
{"", nil, true}, {"", nil, true},
} }
@ -772,6 +776,7 @@ func TestToStringMapE(t *testing.T) {
errmsg := fmt.Sprintf("i = %d", i) // assert helper message errmsg := fmt.Sprintf("i = %d", i) // assert helper message
v, err := ToStringMapE(test.input) v, err := ToStringMapE(test.input)
fmt.Printf("%+v", v)
if test.iserr { if test.iserr {
assert.Error(t, err, errmsg) assert.Error(t, err, errmsg)
continue continue

View File

@ -986,7 +986,16 @@ func ToStringMapE(i interface{}) (map[string]interface{}, error) {
err := jsonStringToObject(v, &m) err := jsonStringToObject(v, &m)
return m, err return m, err
default: default:
return m, fmt.Errorf("unable to cast %#v of type %T to map[string]interface{}", i, i) vo := reflect.ValueOf(i)
if vo.Kind() == reflect.Invalid {
return m, fmt.Errorf("unable to cast %#v of type %T to map[string]interface{}", i, i)
}
for i := 0; i < vo.NumField(); i++ {
if vo.Field(i).CanInterface() {
m[vo.Type().Field(i).Name] = vo.Field(i).Interface()
}
}
return m, nil
} }
} }