Add a ToInt64() and necessary plumbing
diff --git a/cast.go b/cast.go
index 0bc8d48..de5a686 100644
--- a/cast.go
+++ b/cast.go
@@ -27,6 +27,11 @@
return v
}
+func ToInt64(i interface{}) int64 {
+ v, _ := ToInt64E(i)
+ return v
+}
+
func ToInt(i interface{}) int {
v, _ := ToIntE(i)
return v
diff --git a/cast_test.go b/cast_test.go
index debef3d..f135578 100644
--- a/cast_test.go
+++ b/cast_test.go
@@ -23,6 +23,17 @@
assert.Equal(t, ToInt(eight), 8)
}
+func TestToInt64(t *testing.T) {
+ var eight interface{} = 8
+ assert.Equal(t, ToInt64(int64(8)), int64(8))
+ assert.Equal(t, ToInt64(8), int64(8))
+ assert.Equal(t, ToInt64(8.31), int64(8))
+ assert.Equal(t, ToInt64("8"), int64(8))
+ assert.Equal(t, ToInt64(true), int64(1))
+ assert.Equal(t, ToInt64(false), int64(0))
+ assert.Equal(t, ToInt64(eight), int64(8))
+}
+
func TestToFloat64(t *testing.T) {
var eight interface{} = 8
assert.Equal(t, ToFloat64(8), 8.00)
diff --git a/caste.go b/caste.go
index e0a0004..2a6a1fa 100644
--- a/caste.go
+++ b/caste.go
@@ -111,6 +111,42 @@
}
}
+// ToInt64E casts an empty interface to an int64.
+func ToInt64E(i interface{}) (int64, error) {
+ i = indirect(i)
+ jww.DEBUG.Println("ToInt64E called on type:", reflect.TypeOf(i))
+
+ switch s := i.(type) {
+ case int64:
+ return s, nil
+ case int:
+ return int64(s), nil
+ case int32:
+ return int64(s), nil
+ case int16:
+ return int64(s), nil
+ case int8:
+ return int64(s), nil
+ case string:
+ v, err := strconv.ParseInt(s, 0, 0)
+ if err == nil {
+ return v, nil
+ }
+ return 0, fmt.Errorf("Unable to Cast %#v to int64", i)
+ case float64:
+ return int64(s), nil
+ case bool:
+ if bool(s) {
+ return int64(1), nil
+ }
+ return int64(0), nil
+ case nil:
+ return int64(0), nil
+ default:
+ return int64(0), fmt.Errorf("Unable to Cast %#v to int64", i)
+ }
+}
+
// ToIntE casts an empty interface to an int.
func ToIntE(i interface{}) (int, error) {
i = indirect(i)