mirror of
https://github.com/zeromicro/go-zero.git
synced 2026-05-07 15:10:01 +08:00
chore: refactoring & add more tests (#4677)
This commit is contained in:
@@ -53,6 +53,16 @@ func getTag(field reflect.StructField) (string, bool) {
|
|||||||
return strings.TrimSpace(tag), false
|
return strings.TrimSpace(tag), false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func insertValue(collector map[string]map[string]any, tag string, key string, val any) {
|
||||||
|
if m, ok := collector[tag]; ok {
|
||||||
|
m[key] = val
|
||||||
|
} else {
|
||||||
|
collector[tag] = map[string]any{
|
||||||
|
key: val,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func processMember(field reflect.StructField, value reflect.Value,
|
func processMember(field reflect.StructField, value reflect.Value,
|
||||||
collector map[string]map[string]any) error {
|
collector map[string]map[string]any) error {
|
||||||
var key string
|
var key string
|
||||||
@@ -83,29 +93,14 @@ func processMember(field reflect.StructField, value reflect.Value,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
for anonTag, anonMap := range anonCollector {
|
for anonTag, anonMap := range anonCollector {
|
||||||
for anonKey, anonVal := range anonMap {
|
for anonKey, anonVal := range anonMap {
|
||||||
m, ok := collector[anonTag]
|
insertValue(collector, anonTag, anonKey, anonVal)
|
||||||
if ok {
|
|
||||||
m[anonKey] = anonVal
|
|
||||||
} else {
|
|
||||||
m = map[string]any{
|
|
||||||
anonKey: anonVal,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
collector[anonTag] = m
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
m, ok := collector[tag]
|
insertValue(collector, tag, key, val)
|
||||||
if ok {
|
|
||||||
m[key] = val
|
|
||||||
} else {
|
|
||||||
m = map[string]any{
|
|
||||||
key: val,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
collector[tag] = m
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -28,96 +28,121 @@ func TestMarshal(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestMarshal_Anonymous(t *testing.T) {
|
func TestMarshal_Anonymous(t *testing.T) {
|
||||||
type BaseHeader struct {
|
t.Run("anonymous", func(t *testing.T) {
|
||||||
Token string `header:"token"`
|
type BaseHeader struct {
|
||||||
}
|
Token string `header:"token"`
|
||||||
v := struct {
|
}
|
||||||
Name string `json:"name"`
|
v := struct {
|
||||||
Address string `json:"address,options=[beijing,shanghai]"`
|
Name string `json:"name"`
|
||||||
Age int `json:"age"`
|
Address string `json:"address,options=[beijing,shanghai]"`
|
||||||
BaseHeader
|
Age int `json:"age"`
|
||||||
}{
|
BaseHeader
|
||||||
Name: "kevin",
|
}{
|
||||||
Address: "shanghai",
|
Name: "kevin",
|
||||||
Age: 20,
|
Address: "shanghai",
|
||||||
BaseHeader: BaseHeader{
|
Age: 20,
|
||||||
Token: "token_xxx",
|
BaseHeader: BaseHeader{
|
||||||
},
|
Token: "token_xxx",
|
||||||
}
|
},
|
||||||
m, err := Marshal(v)
|
}
|
||||||
assert.Nil(t, err)
|
m, err := Marshal(v)
|
||||||
assert.Equal(t, "kevin", m["json"]["name"])
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, "shanghai", m["json"]["address"])
|
assert.Equal(t, "kevin", m["json"]["name"])
|
||||||
assert.Equal(t, 20, m["json"]["age"].(int))
|
assert.Equal(t, "shanghai", m["json"]["address"])
|
||||||
assert.Equal(t, "token_xxx", m["header"]["token"])
|
assert.Equal(t, 20, m["json"]["age"].(int))
|
||||||
|
assert.Equal(t, "token_xxx", m["header"]["token"])
|
||||||
|
|
||||||
v1 := struct {
|
v1 := struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Address string `json:"address,options=[beijing,shanghai]"`
|
Address string `json:"address,options=[beijing,shanghai]"`
|
||||||
Age int `json:"age"`
|
Age int `json:"age"`
|
||||||
BaseHeader
|
BaseHeader
|
||||||
}{
|
}{
|
||||||
Name: "kevin",
|
Name: "kevin",
|
||||||
Address: "shanghai",
|
Address: "shanghai",
|
||||||
Age: 20,
|
Age: 20,
|
||||||
}
|
}
|
||||||
m1, err1 := Marshal(v1)
|
m1, err1 := Marshal(v1)
|
||||||
assert.Nil(t, err1)
|
assert.Nil(t, err1)
|
||||||
assert.Equal(t, "kevin", m1["json"]["name"])
|
assert.Equal(t, "kevin", m1["json"]["name"])
|
||||||
assert.Equal(t, "shanghai", m1["json"]["address"])
|
assert.Equal(t, "shanghai", m1["json"]["address"])
|
||||||
assert.Equal(t, 20, m1["json"]["age"].(int))
|
assert.Equal(t, 20, m1["json"]["age"].(int))
|
||||||
|
|
||||||
type AnotherHeader struct {
|
type AnotherHeader struct {
|
||||||
Version string `header:"version"`
|
Version string `header:"version"`
|
||||||
}
|
}
|
||||||
v2 := struct {
|
v2 := struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Address string `json:"address,options=[beijing,shanghai]"`
|
Address string `json:"address,options=[beijing,shanghai]"`
|
||||||
Age int `json:"age"`
|
Age int `json:"age"`
|
||||||
BaseHeader
|
BaseHeader
|
||||||
AnotherHeader
|
AnotherHeader
|
||||||
}{
|
}{
|
||||||
Name: "kevin",
|
Name: "kevin",
|
||||||
Address: "shanghai",
|
Address: "shanghai",
|
||||||
Age: 20,
|
Age: 20,
|
||||||
BaseHeader: BaseHeader{
|
BaseHeader: BaseHeader{
|
||||||
Token: "token_xxx",
|
Token: "token_xxx",
|
||||||
},
|
},
|
||||||
AnotherHeader: AnotherHeader{
|
AnotherHeader: AnotherHeader{
|
||||||
Version: "v1.0",
|
Version: "v1.0",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
m2, err2 := Marshal(v2)
|
m2, err2 := Marshal(v2)
|
||||||
assert.Nil(t, err2)
|
assert.Nil(t, err2)
|
||||||
assert.Equal(t, "kevin", m2["json"]["name"])
|
assert.Equal(t, "kevin", m2["json"]["name"])
|
||||||
assert.Equal(t, "shanghai", m2["json"]["address"])
|
assert.Equal(t, "shanghai", m2["json"]["address"])
|
||||||
assert.Equal(t, 20, m2["json"]["age"].(int))
|
assert.Equal(t, 20, m2["json"]["age"].(int))
|
||||||
assert.Equal(t, "token_xxx", m2["header"]["token"])
|
assert.Equal(t, "token_xxx", m2["header"]["token"])
|
||||||
assert.Equal(t, "v1.0", m2["header"]["version"])
|
assert.Equal(t, "v1.0", m2["header"]["version"])
|
||||||
|
|
||||||
type PointerHeader struct {
|
type PointerHeader struct {
|
||||||
Ref *string `header:"ref"`
|
Ref *string `header:"ref"`
|
||||||
}
|
}
|
||||||
ref := "reference"
|
ref := "reference"
|
||||||
v3 := struct {
|
v3 := struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Address string `json:"address,options=[beijing,shanghai]"`
|
Address string `json:"address,options=[beijing,shanghai]"`
|
||||||
Age int `json:"age"`
|
Age int `json:"age"`
|
||||||
PointerHeader
|
PointerHeader
|
||||||
}{
|
}{
|
||||||
Name: "kevin",
|
Name: "kevin",
|
||||||
Address: "shanghai",
|
Address: "shanghai",
|
||||||
Age: 20,
|
Age: 20,
|
||||||
PointerHeader: PointerHeader{
|
PointerHeader: PointerHeader{
|
||||||
Ref: &ref,
|
Ref: &ref,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
m3, err3 := Marshal(v3)
|
m3, err3 := Marshal(v3)
|
||||||
assert.Nil(t, err3)
|
assert.Nil(t, err3)
|
||||||
assert.Equal(t, "kevin", m3["json"]["name"])
|
assert.Equal(t, "kevin", m3["json"]["name"])
|
||||||
assert.Equal(t, "shanghai", m3["json"]["address"])
|
assert.Equal(t, "shanghai", m3["json"]["address"])
|
||||||
assert.Equal(t, 20, m3["json"]["age"].(int))
|
assert.Equal(t, 20, m3["json"]["age"].(int))
|
||||||
assert.Equal(t, "reference", *m3["header"]["ref"].(*string))
|
assert.Equal(t, "reference", *m3["header"]["ref"].(*string))
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("bad anonymous", func(t *testing.T) {
|
||||||
|
type BaseHeader struct {
|
||||||
|
Token string `json:"token,options=[a,b]"`
|
||||||
|
}
|
||||||
|
|
||||||
|
v := struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Address string `json:"address,options=[beijing,shanghai]"`
|
||||||
|
Age int `json:"age"`
|
||||||
|
BaseHeader
|
||||||
|
}{
|
||||||
|
Name: "kevin",
|
||||||
|
Address: "shanghai",
|
||||||
|
Age: 20,
|
||||||
|
BaseHeader: BaseHeader{
|
||||||
|
Token: "c",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := Marshal(v)
|
||||||
|
assert.NotNil(t, err)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMarshal_Ptr(t *testing.T) {
|
func TestMarshal_Ptr(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user