@@ -12,15 +12,16 @@ import (
12
12
// the StructTag with name "default" and the directed value.
13
13
//
14
14
// Usage
15
- // type ExampleBasic struct {
16
- // Foo bool `default:"true"`
17
- // Bar string `default:"33"`
18
- // Qux int8
19
- // Dur time.Duration `default:"2m3s"`
20
- // }
21
15
//
22
- // foo := &ExampleBasic{}
23
- // SetDefaults(foo)
16
+ // type ExampleBasic struct {
17
+ // Foo bool `default:"true"`
18
+ // Bar string `default:"33"`
19
+ // Qux int8
20
+ // Dur time.Duration `default:"2m3s"`
21
+ // }
22
+ //
23
+ // foo := &ExampleBasic{}
24
+ // SetDefaults(foo)
24
25
func SetDefaults (variable interface {}) {
25
26
getDefaultFiller ().Fill (variable )
26
27
}
@@ -90,7 +91,11 @@ func newDefaultFiller() *Filler {
90
91
types := make (map [TypeHash ]FillerFunc , 1 )
91
92
types ["time.Duration" ] = func (field * FieldData ) {
92
93
d , _ := time .ParseDuration (field .TagValue )
93
- field .Value .Set (reflect .ValueOf (d ))
94
+ if field .Value .Kind () == reflect .Ptr {
95
+ field .Value .Set (reflect .ValueOf (& d ))
96
+ } else {
97
+ field .Value .Set (reflect .ValueOf (d ))
98
+ }
94
99
}
95
100
96
101
funcs [reflect .Slice ] = func (field * FieldData ) {
@@ -134,6 +139,70 @@ func newDefaultFiller() *Filler {
134
139
}
135
140
}
136
141
142
+ funcs [reflect .Ptr ] = func (field * FieldData ) {
143
+ if field .TagValue == "" {
144
+ return
145
+ }
146
+ switch field .Value .Type ().Elem ().Kind () {
147
+ case reflect .Bool :
148
+ value , _ := strconv .ParseBool (field .TagValue )
149
+ field .Value .Set (reflect .ValueOf (& value ))
150
+ case reflect .Int :
151
+ v , _ := strconv .ParseInt (field .TagValue , 10 , 64 )
152
+ value := int (v )
153
+ field .Value .Set (reflect .ValueOf (& value ))
154
+ case reflect .Int8 :
155
+ v , _ := strconv .ParseInt (field .TagValue , 10 , 64 )
156
+ value := int8 (v )
157
+ field .Value .Set (reflect .ValueOf (& value ))
158
+ case reflect .Int16 :
159
+ v , _ := strconv .ParseInt (field .TagValue , 10 , 64 )
160
+ value := int16 (v )
161
+ field .Value .Set (reflect .ValueOf (& value ))
162
+ case reflect .Int32 :
163
+ v , _ := strconv .ParseInt (field .TagValue , 10 , 64 )
164
+ value := int32 (v )
165
+ field .Value .Set (reflect .ValueOf (& value ))
166
+ case reflect .Int64 :
167
+ if field .Field .Type == reflect .TypeOf (time .Second ) {
168
+ value , _ := time .ParseDuration (field .TagValue )
169
+ field .Value .Set (reflect .ValueOf (& value ))
170
+ } else {
171
+ value , _ := strconv .ParseInt (field .TagValue , 10 , 64 )
172
+ field .Value .Set (reflect .ValueOf (& value ))
173
+ }
174
+ case reflect .Uint :
175
+ v , _ := strconv .ParseUint (field .TagValue , 10 , 64 )
176
+ value := uint (v )
177
+ field .Value .Set (reflect .ValueOf (& value ))
178
+ case reflect .Uint8 :
179
+ v , _ := strconv .ParseUint (field .TagValue , 10 , 64 )
180
+ value := uint8 (v )
181
+ field .Value .Set (reflect .ValueOf (& value ))
182
+ case reflect .Uint16 :
183
+ v , _ := strconv .ParseUint (field .TagValue , 10 , 64 )
184
+ value := uint16 (v )
185
+ field .Value .Set (reflect .ValueOf (& value ))
186
+ case reflect .Uint32 :
187
+ v , _ := strconv .ParseUint (field .TagValue , 10 , 64 )
188
+ value := uint32 (v )
189
+ field .Value .Set (reflect .ValueOf (& value ))
190
+ case reflect .Uint64 :
191
+ value , _ := strconv .ParseUint (field .TagValue , 10 , 64 )
192
+ field .Value .Set (reflect .ValueOf (& value ))
193
+ case reflect .Float32 :
194
+ v , _ := strconv .ParseFloat (field .TagValue , 64 )
195
+ value := float32 (v )
196
+ field .Value .Set (reflect .ValueOf (& value ))
197
+ case reflect .Float64 :
198
+ value , _ := strconv .ParseFloat (field .TagValue , 64 )
199
+ field .Value .Set (reflect .ValueOf (& value ))
200
+ case reflect .String :
201
+ tagValue := parseDateTimeString (field .TagValue )
202
+ field .Value .Set (reflect .ValueOf (& tagValue ))
203
+ }
204
+ }
205
+
137
206
return & Filler {FuncByKind : funcs , FuncByType : types , Tag : "default" }
138
207
}
139
208
0 commit comments