From 247985a06500acf41f7bef6525eb552d650c1d8d Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Sun, 2 Mar 2025 20:11:10 +0800 Subject: [PATCH] chore: refactoring & add more tests (#4677) --- core/mapping/marshaler.go | 31 +++-- core/mapping/marshaler_test.go | 199 +++++++++++++++++++-------------- 2 files changed, 125 insertions(+), 105 deletions(-) diff --git a/core/mapping/marshaler.go b/core/mapping/marshaler.go index dbbe37085..65d295b1b 100644 --- a/core/mapping/marshaler.go +++ b/core/mapping/marshaler.go @@ -53,6 +53,16 @@ func getTag(field reflect.StructField) (string, bool) { 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, collector map[string]map[string]any) error { var key string @@ -83,29 +93,14 @@ func processMember(field reflect.StructField, value reflect.Value, if err != nil { return err } + for anonTag, anonMap := range anonCollector { for anonKey, anonVal := range anonMap { - m, ok := collector[anonTag] - if ok { - m[anonKey] = anonVal - } else { - m = map[string]any{ - anonKey: anonVal, - } - } - collector[anonTag] = m + insertValue(collector, anonTag, anonKey, anonVal) } } } else { - m, ok := collector[tag] - if ok { - m[key] = val - } else { - m = map[string]any{ - key: val, - } - } - collector[tag] = m + insertValue(collector, tag, key, val) } return nil diff --git a/core/mapping/marshaler_test.go b/core/mapping/marshaler_test.go index ba26a0db1..b09411248 100644 --- a/core/mapping/marshaler_test.go +++ b/core/mapping/marshaler_test.go @@ -28,96 +28,121 @@ func TestMarshal(t *testing.T) { } func TestMarshal_Anonymous(t *testing.T) { - type BaseHeader struct { - Token string `header:"token"` - } - 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: "token_xxx", - }, - } - m, err := Marshal(v) - assert.Nil(t, err) - assert.Equal(t, "kevin", m["json"]["name"]) - assert.Equal(t, "shanghai", m["json"]["address"]) - assert.Equal(t, 20, m["json"]["age"].(int)) - assert.Equal(t, "token_xxx", m["header"]["token"]) + t.Run("anonymous", func(t *testing.T) { + type BaseHeader struct { + Token string `header:"token"` + } + 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: "token_xxx", + }, + } + m, err := Marshal(v) + assert.Nil(t, err) + assert.Equal(t, "kevin", m["json"]["name"]) + assert.Equal(t, "shanghai", m["json"]["address"]) + assert.Equal(t, 20, m["json"]["age"].(int)) + assert.Equal(t, "token_xxx", m["header"]["token"]) - v1 := struct { - Name string `json:"name"` - Address string `json:"address,options=[beijing,shanghai]"` - Age int `json:"age"` - BaseHeader - }{ - Name: "kevin", - Address: "shanghai", - Age: 20, - } - m1, err1 := Marshal(v1) - assert.Nil(t, err1) - assert.Equal(t, "kevin", m1["json"]["name"]) - assert.Equal(t, "shanghai", m1["json"]["address"]) - assert.Equal(t, 20, m1["json"]["age"].(int)) + v1 := struct { + Name string `json:"name"` + Address string `json:"address,options=[beijing,shanghai]"` + Age int `json:"age"` + BaseHeader + }{ + Name: "kevin", + Address: "shanghai", + Age: 20, + } + m1, err1 := Marshal(v1) + assert.Nil(t, err1) + assert.Equal(t, "kevin", m1["json"]["name"]) + assert.Equal(t, "shanghai", m1["json"]["address"]) + assert.Equal(t, 20, m1["json"]["age"].(int)) - type AnotherHeader struct { - Version string `header:"version"` - } - v2 := struct { - Name string `json:"name"` - Address string `json:"address,options=[beijing,shanghai]"` - Age int `json:"age"` - BaseHeader - AnotherHeader - }{ - Name: "kevin", - Address: "shanghai", - Age: 20, - BaseHeader: BaseHeader{ - Token: "token_xxx", - }, - AnotherHeader: AnotherHeader{ - Version: "v1.0", - }, - } - m2, err2 := Marshal(v2) - assert.Nil(t, err2) - assert.Equal(t, "kevin", m2["json"]["name"]) - assert.Equal(t, "shanghai", m2["json"]["address"]) - assert.Equal(t, 20, m2["json"]["age"].(int)) - assert.Equal(t, "token_xxx", m2["header"]["token"]) - assert.Equal(t, "v1.0", m2["header"]["version"]) + type AnotherHeader struct { + Version string `header:"version"` + } + v2 := struct { + Name string `json:"name"` + Address string `json:"address,options=[beijing,shanghai]"` + Age int `json:"age"` + BaseHeader + AnotherHeader + }{ + Name: "kevin", + Address: "shanghai", + Age: 20, + BaseHeader: BaseHeader{ + Token: "token_xxx", + }, + AnotherHeader: AnotherHeader{ + Version: "v1.0", + }, + } + m2, err2 := Marshal(v2) + assert.Nil(t, err2) + assert.Equal(t, "kevin", m2["json"]["name"]) + assert.Equal(t, "shanghai", m2["json"]["address"]) + assert.Equal(t, 20, m2["json"]["age"].(int)) + assert.Equal(t, "token_xxx", m2["header"]["token"]) + assert.Equal(t, "v1.0", m2["header"]["version"]) - type PointerHeader struct { - Ref *string `header:"ref"` - } - ref := "reference" - v3 := struct { - Name string `json:"name"` - Address string `json:"address,options=[beijing,shanghai]"` - Age int `json:"age"` - PointerHeader - }{ - Name: "kevin", - Address: "shanghai", - Age: 20, - PointerHeader: PointerHeader{ - Ref: &ref, - }, - } - m3, err3 := Marshal(v3) - assert.Nil(t, err3) - assert.Equal(t, "kevin", m3["json"]["name"]) - assert.Equal(t, "shanghai", m3["json"]["address"]) - assert.Equal(t, 20, m3["json"]["age"].(int)) - assert.Equal(t, "reference", *m3["header"]["ref"].(*string)) + type PointerHeader struct { + Ref *string `header:"ref"` + } + ref := "reference" + v3 := struct { + Name string `json:"name"` + Address string `json:"address,options=[beijing,shanghai]"` + Age int `json:"age"` + PointerHeader + }{ + Name: "kevin", + Address: "shanghai", + Age: 20, + PointerHeader: PointerHeader{ + Ref: &ref, + }, + } + m3, err3 := Marshal(v3) + assert.Nil(t, err3) + assert.Equal(t, "kevin", m3["json"]["name"]) + assert.Equal(t, "shanghai", m3["json"]["address"]) + assert.Equal(t, 20, m3["json"]["age"].(int)) + 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) {