-
Notifications
You must be signed in to change notification settings - Fork 0
/
fieldmap.go
64 lines (48 loc) · 1.55 KB
/
fieldmap.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package entity
import (
"reflect"
)
type FieldMap map[string]string
func (fm FieldMap) Add(name string, kind string) {
fm[name] = kind
}
func (fm FieldMap) HasField(name string) bool {
_, ok := fm[name]
return ok
}
func (fm FieldMap) FieldType(name string) (string, bool) {
if val, ok := fm[name]; ok {
return val, true
}
return "", false
}
func ToFieldMap(ety interface{}, skip ...string) FieldMap {
fm := FieldMap{}
etyTypeOf := reflect.TypeOf(ety).Elem()
etyValueOf := reflect.ValueOf(ety).Elem()
skipMap := map[string]struct{}{}
for _, v := range skip {
skipMap[v] = struct{}{}
}
iterateEntityFields(etyTypeOf, etyValueOf, &fm, skipMap)
return fm
}
func iterateEntityFields(etyTypeOf reflect.Type, etyValueOf reflect.Value, fieldMap *FieldMap, skip map[string]struct{}) {
fromTypeOfNumField := etyTypeOf.NumField()
for i := 0; i < fromTypeOfNumField; i++ {
if etyTypeOf.Field(i).Type.Kind() == reflect.Pointer && reflect.Indirect(etyValueOf.Field(i)).Kind() == reflect.Struct {
iterateEntityFields(reflect.Indirect(etyValueOf.Field(i)).Type(), reflect.Indirect(etyValueOf.Field(i)), fieldMap, skip)
} else if etyTypeOf.Field(i).Type.Kind() == reflect.Struct {
iterateEntityFields(etyTypeOf.Field(i).Type, etyValueOf.Field(i), fieldMap, skip)
} else {
fName := etyTypeOf.Field(i).Name
if _, toSkip := skip[fName]; toSkip {
continue
}
if etyValueOf.Field(i).Type().String() == "map[string]validator.IValidator" {
continue
}
fieldMap.Add(etyTypeOf.Field(i).Name, etyValueOf.Field(i).Type().String())
}
}
}