@@ -3,6 +3,7 @@ package config
3
3
import (
4
4
"context"
5
5
"errors"
6
+ "reflect"
6
7
"strings"
7
8
"sync"
8
9
"time"
@@ -39,7 +40,13 @@ func NewTask(manager *pgqueue.Manager, threads uint) (server.Task, error) {
39
40
self .manager = manager
40
41
self .taskpool = pgqueue .NewTaskPool (threads )
41
42
self .callbacks = make (map [string ]server.PGCallback , 100 )
42
- self .decoder = marshaler .NewDecoder ("json" , marshaler .ConvertTime , marshaler .ConvertDuration , marshaler .ConvertIntUint )
43
+ self .decoder = marshaler .NewDecoder ("json" ,
44
+ convertPtr ,
45
+ convertFloatToIntUint ,
46
+ marshaler .ConvertTime ,
47
+ marshaler .ConvertDuration ,
48
+ marshaler .ConvertIntUint ,
49
+ )
43
50
return self , nil
44
51
}
45
52
@@ -289,3 +296,53 @@ func joinName(parts ...string) string {
289
296
func splitName (name string , n int ) []string {
290
297
return strings .SplitN (name , namespaceSeparator , n )
291
298
}
299
+
300
+ // //////////////////////////////////////////////////////////////////////////////
301
+ // PRIVATE METHODS
302
+ var (
303
+ nilValue = reflect .ValueOf (nil )
304
+ )
305
+
306
+ // convertPtr returns value if pointer
307
+ func convertPtr (src reflect.Value , dest reflect.Type ) (reflect.Value , error ) {
308
+ // Pass value through
309
+ if src .Type () == dest {
310
+ return src , nil
311
+ }
312
+
313
+ // Convert src to elem
314
+ if dest .Kind () == reflect .Ptr {
315
+ if dest .Elem () == src .Type () {
316
+ if src .CanAddr () {
317
+ return src .Addr (), nil
318
+ } else {
319
+ src_ := reflect .New (dest .Elem ())
320
+ src_ .Elem ().Set (src )
321
+ return src_ , nil
322
+ }
323
+ }
324
+ }
325
+
326
+ // Skip
327
+ return nilValue , nil
328
+ }
329
+
330
+ // convert float types to int or uint
331
+ func convertFloatToIntUint (src reflect.Value , dest reflect.Type ) (reflect.Value , error ) {
332
+ // Pass value through
333
+ if src .Type () == dest {
334
+ return src , nil
335
+ }
336
+ switch dest .Kind () {
337
+ case reflect .Int , reflect .Int8 , reflect .Int16 , reflect .Int32 , reflect .Int64 :
338
+ if src .Kind () == reflect .Float64 || src .Kind () == reflect .Float32 {
339
+ return reflect .ValueOf (int64 (src .Float ())), nil
340
+ }
341
+ case reflect .Uint , reflect .Uint8 , reflect .Uint16 , reflect .Uint32 , reflect .Uint64 :
342
+ if src .Kind () == reflect .Float64 || src .Kind () == reflect .Float32 {
343
+ return reflect .ValueOf (uint64 (src .Float ())), nil
344
+ }
345
+ }
346
+ // Skip
347
+ return nilValue , nil
348
+ }
0 commit comments