@@ -5,11 +5,6 @@ import (
5
5
"strconv"
6
6
)
7
7
8
- type fieldData struct {
9
- Field reflect.StructField
10
- Value reflect.Value
11
- }
12
-
13
8
// Applies the default values to the struct object, the struct type must have
14
9
// the StructTag with name "default" and the directed value.
15
10
//
@@ -23,118 +18,71 @@ type fieldData struct {
23
18
// foo := &ExampleBasic{}
24
19
// SetDefaults(foo)
25
20
func SetDefaults (variable interface {}) {
26
- fields := getFields (variable )
27
- setDefaultValues (fields )
28
- }
29
-
30
- func getFields (variable interface {}) []* fieldData {
31
- valueObject := reflect .ValueOf (variable ).Elem ()
32
-
33
- return getFieldsFromValue (valueObject )
21
+ getDefaultFiller ().Fill (variable )
34
22
}
35
23
36
- func getFieldsFromValue (valueObject reflect.Value ) []* fieldData {
37
- typeObject := valueObject .Type ()
24
+ var defaultFiller * Filler = nil
38
25
39
- count := valueObject .NumField ()
40
- results := make ([]* fieldData , 0 )
41
- for i := 0 ; i < count ; i ++ {
42
- value := valueObject .Field (i )
43
- field := typeObject .Field (i )
44
-
45
- if value .CanSet () {
46
- results = append (results , & fieldData {
47
- Value : value ,
48
- Field : field ,
49
- })
50
- }
26
+ func getDefaultFiller () * Filler {
27
+ if defaultFiller == nil {
28
+ defaultFiller = newDefaultFiller ()
51
29
}
52
30
53
- return results
31
+ return defaultFiller
54
32
}
55
33
56
- func setDefaultValues (fields []* fieldData ) {
57
- for _ , field := range fields {
58
- setDefaultValue (field )
34
+ func newDefaultFiller () * Filler {
35
+ funcs := make (map [reflect.Kind ]fillerFunc , 0 )
36
+ funcs [reflect .Bool ] = func (field * fieldData , defaultValue string ) {
37
+ value , _ := strconv .ParseBool (defaultValue )
38
+ field .Value .SetBool (value )
59
39
}
60
- }
61
40
62
- func setDefaultValue (field * fieldData ) {
63
- defaultValue := field .Field .Tag .Get ("default" )
64
-
65
- switch field .Value .Kind () {
66
- case reflect .Bool :
67
- setDefaultValueToBool (field , defaultValue )
68
- case reflect .Int , reflect .Int8 , reflect .Int16 , reflect .Int32 , reflect .Int64 :
69
- setDefaultValueToInt (field , defaultValue )
70
- case reflect .Float32 , reflect .Float64 :
71
- setDefaultValueToFloat (field , defaultValue )
72
- case reflect .Uint , reflect .Uint8 , reflect .Uint16 , reflect .Uint32 , reflect .Uint64 :
73
- setDefaultValueToUint (field , defaultValue )
74
- case reflect .Slice :
75
- setDefaultValueToSlice (field , defaultValue )
76
- case reflect .String :
77
- setDefaultValueToString (field , defaultValue )
78
- case reflect .Struct :
79
- setDefaultValueToStruct (field , defaultValue )
41
+ funcs [reflect .Int ] = func (field * fieldData , defaultValue string ) {
42
+ value , _ := strconv .ParseInt (defaultValue , 10 , 64 )
43
+ field .Value .SetInt (value )
80
44
}
81
- }
82
45
83
- func setDefaultValueToBool ( field * fieldData , defaultValue string ) {
84
- if field . Value . Bool () != false {
85
- return
86
- }
46
+ funcs [ reflect . Int8 ] = funcs [ reflect . Int ]
47
+ funcs [ reflect . Int16 ] = funcs [ reflect . Int ]
48
+ funcs [ reflect . Int32 ] = funcs [ reflect . Int ]
49
+ funcs [ reflect . Int64 ] = funcs [ reflect . Int ]
87
50
88
- value , _ := strconv .ParseBool (defaultValue )
89
- field .Value .SetBool (value )
90
- }
91
-
92
- func setDefaultValueToInt (field * fieldData , defaultValue string ) {
93
- if field .Value .Int () != 0 {
94
- return
51
+ funcs [reflect .Float32 ] = func (field * fieldData , defaultValue string ) {
52
+ value , _ := strconv .ParseFloat (defaultValue , 64 )
53
+ field .Value .SetFloat (value )
95
54
}
96
55
97
- value , _ := strconv .ParseInt (defaultValue , 10 , 64 )
98
- field .Value .SetInt (value )
99
- }
56
+ funcs [reflect .Float64 ] = funcs [reflect .Float32 ]
100
57
101
- func setDefaultValueToFloat (field * fieldData , defaultValue string ) {
102
- if field . Value . Float () != .0 {
103
- return
58
+ funcs [ reflect . Uint ] = func (field * fieldData , defaultValue string ) {
59
+ value , _ := strconv . ParseUint ( defaultValue , 10 , 64 )
60
+ field . Value . SetUint ( value )
104
61
}
105
62
106
- value , _ := strconv .ParseFloat (defaultValue , 64 )
107
- field .Value .SetFloat (value )
108
- }
63
+ funcs [reflect .Uint8 ] = funcs [reflect .Uint ]
64
+ funcs [reflect .Uint16 ] = funcs [reflect .Uint ]
65
+ funcs [reflect .Uint32 ] = funcs [reflect .Uint ]
66
+ funcs [reflect .Uint64 ] = funcs [reflect .Uint ]
109
67
110
- func setDefaultValueToUint (field * fieldData , defaultValue string ) {
111
- if field .Value .Uint () != 0 {
112
- return
68
+ funcs [reflect .String ] = func (field * fieldData , defaultValue string ) {
69
+ field .Value .SetString (defaultValue )
113
70
}
114
71
115
- value , _ := strconv .ParseUint (defaultValue , 10 , 64 )
116
- field .Value .SetUint (value )
117
- }
72
+ funcs [reflect .Slice ] = func (field * fieldData , defaultValue string ) {
73
+ if field .Value .Type ().Elem ().Kind () == reflect .Uint8 {
74
+ if field .Value .Bytes () != nil {
75
+ return
76
+ }
118
77
119
- func setDefaultValueToSlice (field * fieldData , defaultValue string ) {
120
- if field .Value .Type ().Elem ().Kind () == reflect .Uint8 {
121
- if field .Value .Bytes () != nil {
122
- return
78
+ field .Value .SetBytes ([]byte (defaultValue ))
123
79
}
124
-
125
- field .Value .SetBytes ([]byte (defaultValue ))
126
80
}
127
- }
128
81
129
- func setDefaultValueToString (field * fieldData , defaultValue string ) {
130
- if field .Value . String () != "" {
131
- return
82
+ funcs [ reflect . Struct ] = func (field * fieldData , defaultValue string ) {
83
+ fields := getDefaultFiller (). getFieldsFromValue ( field .Value )
84
+ getDefaultFiller (). setDefaultValues ( fields )
132
85
}
133
86
134
- field .Value .SetString (defaultValue )
135
- }
136
-
137
- func setDefaultValueToStruct (field * fieldData , defaultValue string ) {
138
- fields := getFieldsFromValue (field .Value )
139
- setDefaultValues (fields )
87
+ return & Filler {FuncByKind : funcs , Tag : "default" }
140
88
}
0 commit comments