Skip to content

Commit cf53247

Browse files
committed
Updated decoder
1 parent a6d59f7 commit cf53247

File tree

1 file changed

+58
-1
lines changed

1 file changed

+58
-1
lines changed

pkg/pgqueue/config/task.go

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package config
33
import (
44
"context"
55
"errors"
6+
"reflect"
67
"strings"
78
"sync"
89
"time"
@@ -39,7 +40,13 @@ func NewTask(manager *pgqueue.Manager, threads uint) (server.Task, error) {
3940
self.manager = manager
4041
self.taskpool = pgqueue.NewTaskPool(threads)
4142
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+
)
4350
return self, nil
4451
}
4552

@@ -289,3 +296,53 @@ func joinName(parts ...string) string {
289296
func splitName(name string, n int) []string {
290297
return strings.SplitN(name, namespaceSeparator, n)
291298
}
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

Comments
 (0)