Skip to content

Commit 28d634f

Browse files
authored
Merge pull request #19 from devfeel/develop
#### Version 0.7.7 Feature: add Object-oriented interface for the mapper. comment: the old version implementation will be refactored in next release. Tips: Thanks to @shyandsy
2 parents afed01d + a6b4652 commit 28d634f

File tree

14 files changed

+1355
-29
lines changed

14 files changed

+1355
-29
lines changed

README.md

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# devfeel/mapper
2+
23
A simple and easy go tools for auto mapper struct to map, struct to struct, slice to slice, map to slice, map to json.
34

45
## 1. Install
@@ -8,6 +9,8 @@ go get -u github.com/devfeel/mapper
89
```
910

1011
## 2. Getting Started
12+
13+
Traditional Usage
1114
```go
1215
package main
1316

@@ -66,8 +69,8 @@ func main() {
6669
fmt.Println("teacher", teacher)
6770
fmt.Println("userMap:", userMap)
6871
}
69-
7072
```
73+
7174
执行main,输出:
7275
```
7376
student: &{test 10 testId 100}
@@ -76,7 +79,59 @@ teacher &{test 10 testId }
7679
userMap: &{map 10 x1asd 100 2017-11-20 13:45:56.3972504 +0800 CST m=+0.006004001}
7780
```
7881

82+
Object Usage
83+
84+
```go
85+
package main
86+
87+
import (
88+
"fmt"
89+
"github.com/devfeel/mapper"
90+
)
91+
92+
type (
93+
User struct {
94+
Name string `json:"name" mapper:"name"`
95+
Age int `json:"age" mapper:"age"`
96+
}
97+
98+
Student struct {
99+
Name string `json:"name" mapper:"name"`
100+
Age int `json:"age" mapper:"-"`
101+
}
102+
)
103+
104+
func main() {
105+
user := &User{Name: "test", Age: 10}
106+
student := &Student{}
107+
108+
// create mapper object
109+
m := mapper.NewMapper()
110+
111+
// enable the type checking
112+
m.SetEnabledTypeChecking(true)
113+
114+
student.Age = 1
115+
116+
// disable the json tag
117+
m.SetEnabledJsonTag(false)
118+
119+
// student::age should be 1
120+
m.Mapper(user, student)
121+
122+
fmt.Println(student)
123+
}
124+
```
125+
126+
执行main,输出:
127+
```
128+
&{test 1}
129+
```
130+
131+
132+
79133
## Features
134+
80135
* 支持不同结构体相同名称相同类型字段自动赋值,使用Mapper
81136
* 支持不同结构体Slice的自动赋值,使用MapperSlice
82137
* 支持字段为结构体时的自动赋值
@@ -88,4 +143,15 @@ userMap: &{map 10 x1asd 100 2017-11-20 13:45:56.3972504 +0800 CST m=+0.006004001
88143
* 支持tag标签,tag关键字为 mapper
89144
* 兼容json-tag标签
90145
* 当tag为"-"时,将忽略tag定义,使用struct field name
91-
* 无需手动Register struct,内部自动识别
146+
* 无需手动Register struct,内部自动识别
147+
* 支持开启关闭
148+
* SetEnabledTypeChecking(bool) // 类型检查
149+
* IsEnabledTypeChecking
150+
* SetEnabledMapperTag // mapper tag
151+
* IsEnabledMapperTag
152+
* SetEnabledJsonTag // json tag
153+
* IsEnabledJsonTag
154+
* SetEnabledAutoTypeConvert // auto type convert
155+
* IsEnabledAutoTypeConvert
156+
* SetEnabledMapperStructField // mapper struct field
157+
* IsEnabledMapperStructField

constant.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package mapper
2+
3+
const (
4+
packageVersion = "0.7.6"
5+
mapperTagKey = "mapper"
6+
jsonTagKey = "json"
7+
IgnoreTagValue = "-"
8+
nameConnector = "_"
9+
formatTime = "15:04:05"
10+
formatDate = "2006-01-02"
11+
formatDateTime = "2006-01-02 15:04:05"
12+
)

convert.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package mapper
22

33
import (
4+
"encoding/hex"
45
"fmt"
56
"math/big"
67
"reflect"
@@ -22,12 +23,12 @@ func (f *Convert) Set(v string) {
2223

2324
// Clear string
2425
func (f *Convert) Clear() {
25-
*f = Convert(0x1E)
26+
*f = Convert(hex.EncodeToString([]byte{0x1E}))
2627
}
2728

2829
// Exist check string exist
2930
func (f Convert) Exist() bool {
30-
return string(f) != string(0x1E)
31+
return string(f) != hex.EncodeToString([]byte{0x1E})
3132
}
3233

3334
// Bool string to bool

example/object/go.mod

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module object
2+
3+
go 1.16
4+
5+
replace github.com/devfeel/mapper v0.7.6 => ./../../../mapper
6+
7+
require github.com/devfeel/mapper v0.7.6

example/object/go.sum

Whitespace-only changes.

example/object/main.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"github.com/devfeel/mapper"
6+
)
7+
8+
type (
9+
User struct {
10+
Name string `json:"name" mapper:"name"`
11+
Age int `json:"age" mapper:"age"`
12+
}
13+
14+
Student struct {
15+
Name string `json:"name" mapper:"name"`
16+
Age int `json:"age" mapper:"-"`
17+
}
18+
)
19+
20+
func main() {
21+
user := &User{Name: "test", Age: 10}
22+
student := &Student{}
23+
24+
// create mapper object
25+
m := mapper.NewMapper()
26+
27+
// enable the type checking
28+
m.SetEnabledTypeChecking(true)
29+
30+
student.Age = 1
31+
32+
// disable the json tag
33+
m.SetEnabledJsonTag(false)
34+
35+
// student::age should be 1
36+
m.Mapper(user, student)
37+
38+
fmt.Println(student)
39+
}

example/typewrapper/main.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package main
22

33
import (
4-
"fmt"
5-
"github.com/devfeel/mapper"
64
"reflect"
75
"time"
86
)
@@ -28,7 +26,7 @@ type decimal struct {
2826
}
2927

3028
type DecimalWrapper struct {
31-
mapper.BaseTypeWrapper
29+
// mapper.BaseTypeWrapper
3230
}
3331

3432
func (w *DecimalWrapper) IsType(value reflect.Value) bool {
@@ -39,12 +37,14 @@ func (w *DecimalWrapper) IsType(value reflect.Value) bool {
3937
}
4038

4139
func main() {
42-
mapper.UseWrapper(&DecimalWrapper{})
43-
user := &User{Name: "test", Age: 10, Score: decimal{value: 1}, Time: time.Now()}
44-
stu := &Student{}
40+
/*
41+
mapper.UseWrapper(&DecimalWrapper{})
42+
user := &User{Name: "test", Age: 10, Score: decimal{value: 1}, Time: time.Now()}
43+
stu := &Student{}
4544
46-
mapper.AutoMapper(user, stu)
45+
mapper.AutoMapper(user, stu)
4746
48-
fmt.Println(user)
49-
fmt.Println(stu)
47+
fmt.Println(user)
48+
fmt.Println(stu)
49+
*/
5050
}

go.mod

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module mapper
2+
3+
go 1.16
4+
5+
require github.com/devfeel/mapper v0.7.6

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
github.com/devfeel/mapper v0.7.6 h1:FItOzW4YpEp1x+U1izauW5+sbVIiymOwF7AiWxIdUVk=
2+
github.com/devfeel/mapper v0.7.6/go.mod h1:foz4u16jrssGoDfnWYQGFcthjlU6uBV5UV8uYJfKneA=

mapper.go

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,36 @@ var (
2323
typeWrappers []TypeWrapper
2424
)
2525

26-
const (
27-
packageVersion = "0.7.6"
28-
mapperTagKey = "mapper"
29-
jsonTagKey = "json"
30-
IgnoreTagValue = "-"
31-
nameConnector = "_"
32-
formatTime = "15:04:05"
33-
formatDate = "2006-01-02"
34-
formatDateTime = "2006-01-02 15:04:05"
35-
)
26+
type IMapper interface {
27+
Mapper(fromObj, toObj interface{}) error
28+
AutoMapper(fromObj, toObj interface{}) error
29+
MapperMap(fromMap map[string]interface{}, toObj interface{}) error
30+
Register(obj interface{}) error
31+
GetTypeName(obj interface{}) string
32+
GetFieldName(objElem reflect.Value, index int) string
33+
GetDefaultTimeWrapper() *TimeWrapper
34+
CheckExistsField(elem reflect.Value, fieldName string) (realFieldName string, exists bool)
35+
MapToSlice(fromMap map[string]interface{}, toSlice interface{}) error
36+
MapperMapSlice(fromMaps map[string]map[string]interface{}, toSlice interface{}) error
37+
MapperSlice(fromSlice, toSlice interface{}) error
38+
MapToJson(fromMap map[string]interface{}) ([]byte, error)
39+
JsonToMap(body []byte, toMap *map[string]interface{}) error
40+
41+
SetEnabledTypeChecking(isEnabled bool)
42+
IsEnabledTypeChecking() bool
43+
44+
SetEnabledMapperTag(isEnabled bool)
45+
IsEnabledMapperTag() bool
46+
47+
SetEnabledJsonTag(isEnabled bool)
48+
IsEnabledJsonTag() bool
49+
50+
SetEnabledAutoTypeConvert(isEnabled bool)
51+
IsEnabledAutoTypeConvert() bool
52+
53+
SetEnabledMapperStructField(isEnabled bool)
54+
IsEnabledMapperStructField() bool
55+
}
3656

3757
func init() {
3858
ZeroValue = reflect.Value{}
@@ -136,7 +156,7 @@ func registerValue(objValue reflect.Value) error {
136156
}
137157
}
138158

139-
//store register flag
159+
// store register flag
140160
registerMap.Store(typeName, nil)
141161
return nil
142162
}
@@ -194,14 +214,14 @@ func MapperMap(fromMap map[string]interface{}, toObj interface{}) error {
194214
if toElem == ZeroValue {
195215
return errors.New("to obj is not legal value")
196216
}
197-
//check register flag
198-
//if not register, register it
217+
// check register flag
218+
// if not register, register it
199219
if !checkIsRegister(toElem) {
200220
Register(toObj)
201221
}
202222
for k, v := range fromMap {
203223
fieldName := k
204-
//check field is exists
224+
// check field is exists
205225
realFieldName, exists := CheckExistsField(toElem, fieldName)
206226
if !exists {
207227
continue
@@ -274,7 +294,7 @@ func MapperMapSlice(fromMaps map[string]map[string]interface{}, toSlice interfac
274294
toElemType := reflect.TypeOf(toSlice).Elem().Elem()
275295
realType := toElemType.Kind()
276296
direct := reflect.Indirect(toValue)
277-
//3 elem parse: 1.[]*type 2.*type 3.type
297+
// 3 elem parse: 1.[]*type 2.*type 3.type
278298
if realType == reflect.Ptr {
279299
toElemType = toElemType.Elem()
280300
}
@@ -307,7 +327,7 @@ func MapperSlice(fromSlice, toSlice interface{}) error {
307327
elemType := reflect.TypeOf(toSlice).Elem().Elem()
308328
realType := elemType.Kind()
309329
direct := reflect.Indirect(toValue)
310-
//3 elem parse: 1.[]*type 2.*type 3.type
330+
// 3 elem parse: 1.[]*type 2.*type 3.type
311331
if realType == reflect.Ptr {
312332
elemType = elemType.Elem()
313333
}

0 commit comments

Comments
 (0)