Skip to content

Commit 49d9309

Browse files
authored
Merge pull request #35 from devfeel/develop
Fix the problem when the tag behavior is set dynamically and support custom tags
2 parents f14f3f9 + 3e5bb54 commit 49d9309

6 files changed

Lines changed: 87 additions & 4 deletions

File tree

constant.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package mapper
22

33
const (
4-
packageVersion = "0.7.10"
4+
packageVersion = "0.7.11"
55
mapperTagKey = "mapper"
66
jsonTagKey = "json"
77
IgnoreTagValue = "-"

example/main.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ type (
3131
Level string
3232
}
3333

34+
Leader struct {
35+
Name string
36+
LeaderAge int `form:"Age"`
37+
}
38+
3439
JsonUser struct {
3540
Name string
3641
Age int
@@ -39,8 +44,6 @@ type (
3944
)
4045

4146
func init() {
42-
mapper.Register(&User{})
43-
mapper.Register(&Student{})
4447
}
4548

4649
func main() {
@@ -74,5 +77,15 @@ func main() {
7477
Time: mapper.JSONTime(time.Now()),
7578
}
7679

80+
user2 := &User{Name: "User2", Age: 35}
81+
leader1 := &Leader{}
82+
leader2 := &Leader{}
83+
mapper.Mapper(user2, leader1)
84+
fmt.Println("leader first:", leader1)
85+
mapper.SetCustomTagName("form")
86+
mapper.SetEnabledCustomTag(true)
87+
mapper.Mapper(user2, leader2)
88+
fmt.Println("leader second:", leader2)
89+
7790
fmt.Println(jsonUser)
7891
}

mapper.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ type IMapper interface {
3737
SetEnabledJsonTag(isEnabled bool)
3838
IsEnabledJsonTag() bool
3939

40+
SetEnabledCustomTag(isEnabled bool)
41+
IsEnabledCustomTag() bool
42+
SetCustomTagName(tagName string)
43+
4044
SetEnabledAutoTypeConvert(isEnabled bool)
4145
IsEnabledAutoTypeConvert() bool
4246

@@ -86,6 +90,22 @@ func SetEnabledJsonTag(isEnabled bool) {
8690
standardMapper.SetEnabledJsonTag(isEnabled)
8791
}
8892

93+
// SetEnabledCustomTag set enabled flag for set custom tag name
94+
// if set true and set customTagName, the custom tag will be check during mapping's GetFieldName
95+
// default is false
96+
func SetEnabledCustomTag(isEnabled bool) {
97+
standardMapper.SetEnabledCustomTag(isEnabled)
98+
}
99+
100+
func IsEnabledCustomTag() bool {
101+
return standardMapper.IsEnabledCustomTag()
102+
}
103+
104+
// SetCustomTagName
105+
func SetCustomTagName(tagName string) {
106+
standardMapper.SetCustomTagName(tagName)
107+
}
108+
89109
// SetEnabledAutoTypeConvert set enabled flag for auto type convert
90110
// if set true, field will auto convert in Time and Unix
91111
// default is true

mapper_object.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ type mapperObject struct {
2222
enabledMapperTag bool
2323
enabledJsonTag bool
2424

25+
enabledCustomTag bool
26+
customTagName string
27+
2528
// in the version < 0.7.8, we use field name as the key when mapping structs if field tag is "-"
2629
// from 0.7.8, we add switch enableIgnoreFieldTag which is false in default
2730
// if caller enable this flag, the field will be ignored in the mapping process
@@ -40,6 +43,7 @@ func NewMapper() IMapper {
4043
enabledAutoTypeConvert: true,
4144
enabledMapperTag: true,
4245
enabledJsonTag: true,
46+
enabledCustomTag: false,
4347
enableFieldIgnoreTag: false, // 保留老版本默认行为:对于tag = “-”的字段使用FieldName
4448
}
4549
dm.useWrapper(dm.DefaultTimeWrapper)
@@ -130,6 +134,7 @@ func (dm *mapperObject) IsEnabledTypeChecking() bool {
130134
// default is true
131135
func (dm *mapperObject) SetEnabledMapperTag(isEnabled bool) {
132136
dm.enabledMapperTag = isEnabled
137+
dm.cleanRegisterValue()
133138
}
134139

135140
func (dm *mapperObject) IsEnabledMapperTag() bool {
@@ -141,6 +146,7 @@ func (dm *mapperObject) IsEnabledMapperTag() bool {
141146
// default is true
142147
func (dm *mapperObject) SetEnabledJsonTag(isEnabled bool) {
143148
dm.enabledJsonTag = isEnabled
149+
dm.cleanRegisterValue()
144150
}
145151

146152
func (dm *mapperObject) IsEnabledJsonTag() bool {
@@ -172,6 +178,23 @@ func (dm *mapperObject) IsEnabledMapperStructField() bool {
172178
return dm.enabledMapperStructField
173179
}
174180

181+
// SetEnabledCustomTag set enabled flag for set custom tag name
182+
// if set true and set customTagName, the custom tag will be check during mapping's GetFieldName
183+
// default is false
184+
func (dm *mapperObject) SetEnabledCustomTag(isEnabled bool) {
185+
dm.enabledCustomTag = isEnabled
186+
dm.cleanRegisterValue()
187+
}
188+
189+
func (dm *mapperObject) IsEnabledCustomTag() bool {
190+
return dm.enabledCustomTag
191+
}
192+
193+
// SetCustomTagName
194+
func (dm *mapperObject) SetCustomTagName(tagName string) {
195+
dm.customTagName = tagName
196+
}
197+
175198
// SetEnableFieldIgnoreTag set the enabled flag for the ignored tag
176199
// in the version < 0.7.8, we use field name as the key when mapping structs if field tag is "-"
177200
// from 0.7.8, we add switch enableFieldIgnoreTag which is false in default

mapper_object_internal.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,20 @@ func (dm *mapperObject) registerValue(objValue reflect.Value) error {
3737
return nil
3838
}
3939

40+
// cleanRegisterValue clean all register Value
41+
func (dm *mapperObject) cleanRegisterValue() {
42+
dm.registerMap.Range(func(key, value interface{}) bool {
43+
dm.registerMap.Delete(key)
44+
return true
45+
})
46+
}
47+
4048
// GetFieldName get fieldName with ElemValue and index
4149
// if config tag string, return tag value
4250
func (dm *mapperObject) getFieldName(objElem reflect.Value, index int) string {
4351
fieldName := ""
4452
field := objElem.Type().Field(index)
4553
tag := dm.getStructTag(field)
46-
4754
// keeps the behavior in old version
4855
if tag == IgnoreTagValue && !dm.IsEnableFieldIgnoreTag() {
4956
tag = ""
@@ -288,6 +295,15 @@ func (dm *mapperObject) getStructTag(field reflect.StructField) string {
288295
}
289296
}
290297

298+
// 3.che
299+
// ck customTag
300+
if dm.enabledCustomTag {
301+
tagValue = field.Tag.Get(dm.customTagName)
302+
if tagValue != "" {
303+
return tagValue
304+
}
305+
}
306+
291307
return tagValue
292308
}
293309

version.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
## devfeel/mapper
22

3+
#### Version 0.7.11
4+
* BugFix: Fix the problem that getFieldName cannot take effect when the tag behavior is set dynamically.
5+
* Feature: Add SetEnabledCustomTag\SetCustomTagName to support custom tags, except mapper tag and json tag, for issue #34
6+
* Tips: EnabledCustomTag default value is false.
7+
* you can use like this:
8+
``` go
9+
mapper.SetCustomTagName("form")
10+
mapper.SetEnabledCustomTag(true)
11+
```
12+
* 2022-07-04 18:00 in ShangHai
13+
314
#### Version 0.7.10
415
* BugFix: remove go mod file.
516
* 2022-04-20 20:00 in ShangHai

0 commit comments

Comments
 (0)