From 9cf18cf5befa68a9319831e2473cb996e2059268 Mon Sep 17 00:00:00 2001 From: Wenpiner <127460925+Wenpiner@users.noreply.github.com> Date: Mon, 1 Apr 2024 12:11:22 +0000 Subject: [PATCH 1/4] feat: Added custom Tag Option Custom Tag function The default json is effective in proto [#129](https://github.com/jinzhu/copier/issues/129#issuecomment-1643201774), providing a more flexible tagging method. This feature has been thoroughly tested and proven in local environments. --- copier.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/copier.go b/copier.go index 0cc6465..a894659 100644 --- a/copier.go +++ b/copier.go @@ -44,6 +44,8 @@ type Option struct { // Custom field name mappings to copy values with different names in `fromValue` and `toValue` types. // Examples can be found in `copier_field_name_mapping_test.go`. FieldNameMapping []FieldNameMapping + // Tag + Tag string } func (opt Option) converters() map[converterPair]TypeConverter { @@ -304,9 +306,11 @@ func copier(toValue interface{}, fromValue interface{}, opt Option) (err error) initDest = true dest = indirect(reflect.New(toType)) } - + if opt.Tag == "" { + opt.Tag = "copier" + } // Get tag options - flgs, err := getFlags(dest, source, toType, fromType) + flgs, err := getFlags(dest, source, toType, fromType, opt.Tag) if err != nil { return err } @@ -705,7 +709,7 @@ func parseTags(tag string) (flg uint8, name string, err error) { } // getTagFlags Parses struct tags for bit flags, field name. -func getFlags(dest, src reflect.Value, toType, fromType reflect.Type) (flags, error) { +func getFlags(dest, src reflect.Value, toType, fromType reflect.Type, tag string) (flags, error) { flgs := flags{ BitFlags: map[string]uint8{}, SrcNames: tagNameMapping{ @@ -727,7 +731,7 @@ func getFlags(dest, src reflect.Value, toType, fromType reflect.Type) (flags, er // Get a list dest of tags for _, field := range toTypeFields { - tags := field.Tag.Get("copier") + tags := field.Tag.Get(tag) if tags != "" { var name string var err error @@ -742,7 +746,7 @@ func getFlags(dest, src reflect.Value, toType, fromType reflect.Type) (flags, er // Get a list source of tags for _, field := range fromTypeFields { - tags := field.Tag.Get("copier") + tags := field.Tag.Get(tag) if tags != "" { var name string var err error From f624d860b40bdb9fd79826695783fd4f1f270285 Mon Sep 17 00:00:00 2001 From: Wenpiner <127460925+Wenpiner@users.noreply.github.com> Date: Mon, 1 Apr 2024 14:20:43 +0000 Subject: [PATCH 2/4] fix: tag upper --- copier.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/copier.go b/copier.go index a894659..695e44f 100644 --- a/copier.go +++ b/copier.go @@ -698,11 +698,12 @@ func parseTags(tag string) (flg uint8, name string, err error) { case "nopanic": flg = flg | tagNoPanic default: - if unicode.IsUpper([]rune(t)[0]) { - name = strings.TrimSpace(t) - } else { - err = ErrFieldNameTagStartNotUpperCase - } + name = strings.TrimSpace(t) + // if unicode.IsUpper([]rune(t)[0]) { + // name = strings.TrimSpace(t) + // } else { + // err = ErrFieldNameTagStartNotUpperCase + // } } } return From 6394108e6623a5cd2046f5a50a16119427510faf Mon Sep 17 00:00:00 2001 From: Wenpiner <127460925+Wenpiner@users.noreply.github.com> Date: Mon, 1 Apr 2024 14:27:27 +0000 Subject: [PATCH 3/4] fix: u --- copier.go | 1 - 1 file changed, 1 deletion(-) diff --git a/copier.go b/copier.go index 695e44f..3da1f9f 100644 --- a/copier.go +++ b/copier.go @@ -7,7 +7,6 @@ import ( "reflect" "strings" "sync" - "unicode" ) // These flags define options for tag handling From b1dd1c30a7e73749ac22f20141905c8f1ca90881 Mon Sep 17 00:00:00 2001 From: Wenpiner <127460925+Wenpiner@users.noreply.github.com> Date: Mon, 1 Apr 2024 15:41:45 +0000 Subject: [PATCH 4/4] fix: parseTags --- copier.go | 1 + 1 file changed, 1 insertion(+) diff --git a/copier.go b/copier.go index 3da1f9f..7377589 100644 --- a/copier.go +++ b/copier.go @@ -704,6 +704,7 @@ func parseTags(tag string) (flg uint8, name string, err error) { // err = ErrFieldNameTagStartNotUpperCase // } } + return } return }