WeaklyTypedHook
diff --git a/decode_hooks.go b/decode_hooks.go
index f9ae144..2bbd54a 100644
--- a/decode_hooks.go
+++ b/decode_hooks.go
@@ -2,6 +2,7 @@
import (
"reflect"
+ "strconv"
"strings"
)
@@ -45,3 +46,35 @@
return strings.Split(raw, sep), nil
}
}
+
+func WeaklyTypedHook(
+ f reflect.Kind,
+ t reflect.Kind,
+ data interface{}) (interface{}, error) {
+ dataVal := reflect.ValueOf(data)
+ switch t {
+ case reflect.String:
+ switch f {
+ case reflect.Bool:
+ if dataVal.Bool() {
+ return "1", nil
+ } else {
+ return "0", nil
+ }
+ case reflect.Float32:
+ return strconv.FormatFloat(dataVal.Float(), 'f', -1, 64), nil
+ case reflect.Int:
+ return strconv.FormatInt(dataVal.Int(), 10), nil
+ case reflect.Slice:
+ dataType := dataVal.Type()
+ elemKind := dataType.Elem().Kind()
+ if elemKind == reflect.Uint8 {
+ return string(dataVal.Interface().([]uint8)), nil
+ }
+ case reflect.Uint:
+ return strconv.FormatUint(dataVal.Uint(), 10), nil
+ }
+ }
+
+ return data, nil
+}
diff --git a/decode_hooks_test.go b/decode_hooks_test.go
index 6a226a7..454d1f3 100644
--- a/decode_hooks_test.go
+++ b/decode_hooks_test.go
@@ -110,3 +110,75 @@
}
}
}
+
+func TestWeaklyTypedHook(t *testing.T) {
+ var f DecodeHookFunc = WeaklyTypedHook
+
+ cases := []struct {
+ f, t reflect.Kind
+ data interface{}
+ result interface{}
+ err bool
+ }{
+ // TO STRING
+ {
+ reflect.Bool,
+ reflect.String,
+ false,
+ "0",
+ false,
+ },
+
+ {
+ reflect.Bool,
+ reflect.String,
+ true,
+ "1",
+ false,
+ },
+
+ {
+ reflect.Float32,
+ reflect.String,
+ float32(7),
+ "7",
+ false,
+ },
+
+ {
+ reflect.Int,
+ reflect.String,
+ int(7),
+ "7",
+ false,
+ },
+
+ {
+ reflect.Slice,
+ reflect.String,
+ []uint8("foo"),
+ "foo",
+ false,
+ },
+
+ {
+ reflect.Uint,
+ reflect.String,
+ uint(7),
+ "7",
+ false,
+ },
+ }
+
+ for i, tc := range cases {
+ actual, err := f(tc.f, tc.t, tc.data)
+ if tc.err != (err != nil) {
+ t.Fatalf("case %d: expected err %#v", i, tc.err)
+ }
+ if !reflect.DeepEqual(actual, tc.result) {
+ t.Fatalf(
+ "case %d: expected %#v, got %#v",
+ i, tc.result, actual)
+ }
+ }
+}