chore: refactoring & add more tests (#4677)

This commit is contained in:
Kevin Wan
2025-03-02 20:11:10 +08:00
committed by GitHub
parent 80573af0d8
commit 247985a065
2 changed files with 125 additions and 105 deletions

View File

@@ -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

View File

@@ -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) {