Skip to content

Commit f12b58f

Browse files
authored
Merge pull request #41 from devfeel/master
#### Version 0.7.14
2 parents 8360d9a + 347b0c0 commit f12b58f

File tree

10 files changed

+263
-59
lines changed

10 files changed

+263
-59
lines changed

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.13"
4+
packageVersion = "0.7.14"
55
mapperTagKey = "mapper"
66
jsonTagKey = "json"
77
IgnoreTagValue = "-"

example/newmapper/main.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"github.com/devfeel/mapper"
6+
"time"
7+
)
8+
9+
type (
10+
User struct {
11+
Name string
12+
Age int `mapper:"_Age"`
13+
Id string `mapper:"_id"`
14+
AA string `json:"Score,omitempty"`
15+
Data []byte
16+
Students []Student
17+
Time time.Time
18+
}
19+
20+
Student struct {
21+
Name string
22+
Age int
23+
Id string `mapper:"_id"`
24+
Score string
25+
}
26+
27+
Teacher struct {
28+
Name string
29+
Age int
30+
Id string `mapper:"_id"`
31+
Level string
32+
}
33+
)
34+
35+
func main() {
36+
user := &User{}
37+
userMap := &User{}
38+
teacher := &Teacher{}
39+
student := &Student{Name: "test", Age: 10, Id: "testId", Score: "100"}
40+
valMap := make(map[string]interface{})
41+
valMap["Name"] = "map"
42+
valMap["Age"] = 10
43+
valMap["_id"] = "x1asd"
44+
valMap["Score"] = 100
45+
valMap["Data"] = []byte{1, 2, 3, 4}
46+
valMap["Students"] = []byte{1, 2, 3, 4} //[]Student{*student}
47+
valMap["Time"] = time.Now()
48+
49+
mp := mapper.NewMapper(mapper.CTypeChecking(true), mapper.CMapperTag(true))
50+
51+
mp.Mapper(student, user)
52+
mp.AutoMapper(student, teacher)
53+
mp.MapperMap(valMap, userMap)
54+
55+
fmt.Println("student:", student)
56+
fmt.Println("user:", user)
57+
fmt.Println("teacher", teacher)
58+
fmt.Println("userMap:", userMap)
59+
}

mapper.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type IMapper interface {
2323

2424
GetTypeName(obj interface{}) string
2525
GetFieldName(objElem reflect.Value, index int) string
26+
GetCustomTagName() string
2627
GetDefaultTimeWrapper() *TimeWrapper
2728

2829
CheckExistsField(elem reflect.Value, fieldName string) (realFieldName string, exists bool)

mapper_object.go

Lines changed: 38 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -9,42 +9,25 @@ import (
99
)
1010

1111
type mapperObject struct {
12-
ZeroValue reflect.Value
13-
DefaultTimeWrapper *TimeWrapper
14-
typeWrappers []TypeWrapper
15-
timeType reflect.Type
16-
jsonTimeType reflect.Type
17-
fieldNameMap sync.Map
18-
registerMap sync.Map
19-
enabledTypeChecking bool
20-
enabledMapperStructField bool
21-
enabledAutoTypeConvert bool
22-
enabledMapperTag bool
23-
enabledJsonTag bool
24-
25-
enabledCustomTag bool
26-
customTagName string
27-
28-
// in the version < 0.7.8, we use field name as the key when mapping structs if field tag is "-"
29-
// from 0.7.8, we add switch enableIgnoreFieldTag which is false in default
30-
// if caller enable this flag, the field will be ignored in the mapping process
31-
enableFieldIgnoreTag bool
32-
}
33-
34-
func NewMapper() IMapper {
12+
ZeroValue reflect.Value
13+
DefaultTimeWrapper *TimeWrapper
14+
typeWrappers []TypeWrapper
15+
timeType reflect.Type
16+
jsonTimeType reflect.Type
17+
fieldNameMap sync.Map
18+
registerMap sync.Map
19+
setting *Setting
20+
}
21+
22+
func NewMapper(opts ...Option) IMapper {
23+
setting := NewSetting(opts...)
3524
dm := mapperObject{
36-
ZeroValue: reflect.Value{},
37-
DefaultTimeWrapper: NewTimeWrapper(),
38-
typeWrappers: []TypeWrapper{},
39-
timeType: reflect.TypeOf(time.Now()),
40-
jsonTimeType: reflect.TypeOf(JSONTime(time.Now())),
41-
enabledTypeChecking: false,
42-
enabledMapperStructField: true,
43-
enabledAutoTypeConvert: true,
44-
enabledMapperTag: true,
45-
enabledJsonTag: true,
46-
enabledCustomTag: false,
47-
enableFieldIgnoreTag: false, // 保留老版本默认行为:对于tag = “-”的字段使用FieldName
25+
ZeroValue: reflect.Value{},
26+
DefaultTimeWrapper: NewTimeWrapper(),
27+
typeWrappers: []TypeWrapper{},
28+
timeType: reflect.TypeOf(time.Now()),
29+
jsonTimeType: reflect.TypeOf(JSONTime(time.Now())),
30+
setting: setting,
4831
}
4932
dm.useWrapper(dm.DefaultTimeWrapper)
5033
return &dm
@@ -122,46 +105,46 @@ func (dm *mapperObject) MapperMap(fromMap map[string]interface{}, toObj interfac
122105
// if set true, the field type will be checked for consistency during mapping
123106
// default is false
124107
func (dm *mapperObject) SetEnabledTypeChecking(isEnabled bool) {
125-
dm.enabledTypeChecking = isEnabled
108+
dm.setting.EnabledTypeChecking = isEnabled
126109
}
127110

128111
func (dm *mapperObject) IsEnabledTypeChecking() bool {
129-
return dm.enabledTypeChecking
112+
return dm.setting.EnabledTypeChecking
130113
}
131114

132115
// SetEnabledMapperTag set enabled flag for 'Mapper' tag check
133116
// if set true, 'Mapper' tag will be check during mapping's GetFieldName
134117
// default is true
135118
func (dm *mapperObject) SetEnabledMapperTag(isEnabled bool) {
136-
dm.enabledMapperTag = isEnabled
119+
dm.setting.EnabledMapperTag = isEnabled
137120
dm.cleanRegisterValue()
138121
}
139122

140123
func (dm *mapperObject) IsEnabledMapperTag() bool {
141-
return dm.enabledMapperTag
124+
return dm.setting.EnabledMapperTag
142125
}
143126

144127
// SetEnabledJsonTag set enabled flag for 'Json' tag check
145128
// if set true, 'Json' tag will be check during mapping's GetFieldName
146129
// default is true
147130
func (dm *mapperObject) SetEnabledJsonTag(isEnabled bool) {
148-
dm.enabledJsonTag = isEnabled
131+
dm.setting.EnabledJsonTag = isEnabled
149132
dm.cleanRegisterValue()
150133
}
151134

152135
func (dm *mapperObject) IsEnabledJsonTag() bool {
153-
return dm.enabledJsonTag
136+
return dm.setting.EnabledJsonTag
154137
}
155138

156139
// SetEnabledAutoTypeConvert set enabled flag for auto type convert
157140
// if set true, field will auto convert in Time and Unix
158141
// default is true
159142
func (dm *mapperObject) SetEnabledAutoTypeConvert(isEnabled bool) {
160-
dm.enabledAutoTypeConvert = isEnabled
143+
dm.setting.EnabledAutoTypeConvert = isEnabled
161144
}
162145

163146
func (dm *mapperObject) IsEnabledAutoTypeConvert() bool {
164-
return dm.enabledAutoTypeConvert
147+
return dm.setting.EnabledAutoTypeConvert
165148
}
166149

167150
// SetEnabledMapperStructField set enabled flag for MapperStructField
@@ -171,40 +154,40 @@ func (dm *mapperObject) IsEnabledAutoTypeConvert() bool {
171154
// 2. fromField and toField must be not same type
172155
// default is enabled
173156
func (dm *mapperObject) SetEnabledMapperStructField(isEnabled bool) {
174-
dm.enabledMapperStructField = isEnabled
157+
dm.setting.EnabledMapperStructField = isEnabled
175158
}
176159

177160
func (dm *mapperObject) IsEnabledMapperStructField() bool {
178-
return dm.enabledMapperStructField
161+
return dm.setting.EnabledMapperStructField
179162
}
180163

181164
// SetEnabledCustomTag set enabled flag for set custom tag name
182165
// if set true and set customTagName, the custom tag will be check during mapping's GetFieldName
183166
// default is false
184167
func (dm *mapperObject) SetEnabledCustomTag(isEnabled bool) {
185-
dm.enabledCustomTag = isEnabled
168+
dm.setting.EnabledCustomTag = isEnabled
186169
dm.cleanRegisterValue()
187170
}
188171

189172
func (dm *mapperObject) IsEnabledCustomTag() bool {
190-
return dm.enabledCustomTag
173+
return dm.setting.EnabledCustomTag
191174
}
192175

193176
// SetCustomTagName
194177
func (dm *mapperObject) SetCustomTagName(tagName string) {
195-
dm.customTagName = tagName
178+
dm.setting.CustomTagName = tagName
196179
}
197180

198181
// SetEnableFieldIgnoreTag set the enabled flag for the ignored tag
199182
// in the version < 0.7.8, we use field name as the key when mapping structs if field tag is "-"
200183
// from 0.7.8, we add switch enableFieldIgnoreTag which is false in default
201184
// if caller enable this flag, the field will be ignored in the mapping process
202185
func (dm *mapperObject) SetEnableFieldIgnoreTag(isEnabled bool) {
203-
dm.enableFieldIgnoreTag = isEnabled
186+
dm.setting.EnableFieldIgnoreTag = isEnabled
204187
}
205188

206189
func (dm *mapperObject) IsEnableFieldIgnoreTag() bool {
207-
return dm.enableFieldIgnoreTag
190+
return dm.setting.EnableFieldIgnoreTag
208191
}
209192

210193
// GetTypeName get type name
@@ -213,6 +196,11 @@ func (dm *mapperObject) GetTypeName(obj interface{}) string {
213196
return object.String()
214197
}
215198

199+
// GetCustomTagName get CustomTagName
200+
func (dm *mapperObject) GetCustomTagName() string {
201+
return dm.setting.CustomTagName
202+
}
203+
216204
// GetFieldName get fieldName with ElemValue and index
217205
// if config tag string, return tag value
218206
func (dm *mapperObject) GetFieldName(objElem reflect.Value, index int) string {

mapper_object_internal.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,13 @@ func (dm *mapperObject) convertstructfieldInternal(fieldName string, fromFieldIn
135135

136136
toFieldInfo := toElem.FieldByName(realFieldName)
137137
// check field is same type
138-
if dm.enabledTypeChecking {
138+
if dm.setting.EnabledTypeChecking {
139139
if fromFieldInfo.Kind() != toFieldInfo.Kind() {
140140
return nil
141141
}
142142
}
143143

144-
if dm.enabledMapperStructField &&
144+
if dm.setting.EnabledMapperStructField &&
145145
toFieldInfo.Kind() == reflect.Struct && fromFieldInfo.Kind() == reflect.Struct &&
146146
toFieldInfo.Type() != fromFieldInfo.Type() &&
147147
!dm.checkIsTypeWrapper(toFieldInfo) && !dm.checkIsTypeWrapper(fromFieldInfo) {
@@ -154,7 +154,7 @@ func (dm *mapperObject) convertstructfieldInternal(fieldName string, fromFieldIn
154154
}
155155
} else {
156156
isSet := false
157-
if dm.enabledAutoTypeConvert {
157+
if dm.setting.EnabledAutoTypeConvert {
158158
if dm.DefaultTimeWrapper.IsType(fromFieldInfo) && toFieldInfo.Kind() == reflect.Int64 {
159159
fromTime := fromFieldInfo.Interface().(time.Time)
160160
toFieldInfo.Set(reflect.ValueOf(TimeToUnix(fromTime)))
@@ -263,7 +263,7 @@ func (dm *mapperObject) setFieldValue(fieldValue reflect.Value, fieldKind reflec
263263
case string:
264264
timeString = d
265265
case int64:
266-
if dm.enabledAutoTypeConvert {
266+
if dm.setting.EnabledAutoTypeConvert {
267267
// try to transform Unix time to local Time
268268
t, err := UnixToTimeLocation(value.(int64), time.UTC.String())
269269
if err != nil {
@@ -303,15 +303,15 @@ func (dm *mapperObject) setFieldValue(fieldValue reflect.Value, fieldKind reflec
303303
func (dm *mapperObject) getStructTag(field reflect.StructField) string {
304304
tagValue := ""
305305
// 1.check mapperTagKey
306-
if dm.enabledMapperTag {
306+
if dm.setting.EnabledMapperTag {
307307
tagValue = field.Tag.Get(mapperTagKey)
308308
if tagValue != "" {
309309
return tagValue
310310
}
311311
}
312312

313313
// 2.check jsonTagKey
314-
if dm.enabledJsonTag {
314+
if dm.setting.EnabledJsonTag {
315315
tagValue = field.Tag.Get(jsonTagKey)
316316
if tagValue != "" {
317317
// support more tag property, as json tag omitempty 2018-07-13
@@ -321,8 +321,8 @@ func (dm *mapperObject) getStructTag(field reflect.StructField) string {
321321

322322
// 3.che
323323
// ck customTag
324-
if dm.enabledCustomTag {
325-
tagValue = field.Tag.Get(dm.customTagName)
324+
if dm.setting.EnabledCustomTag {
325+
tagValue = field.Tag.Get(dm.setting.CustomTagName)
326326
if tagValue != "" {
327327
return tagValue
328328
}

mapper_object_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
package mapper
22

33
import (
4+
"fmt"
45
"reflect"
56
"strconv"
67
"sync"
78
"testing"
89
"time"
910
)
1011

12+
func TestMapperObject_NewMapper(t *testing.T) {
13+
m := NewMapper(CTypeChecking(true), CCustomTagName("^"))
14+
fmt.Println(m)
15+
}
16+
1117
func Test_Object_SetEnabledTypeChecking(t *testing.T) {
1218
m := NewMapper()
1319
m.SetEnabledTypeChecking(true)

0 commit comments

Comments
 (0)