Fix eq and ne tpl function issue
authorTatsushi Demachi <tdemachi@gmail.com>
Mon, 9 Mar 2015 13:55:04 +0000 (22:55 +0900)
committerbep <bjorn.erik.pedersen@gmail.com>
Mon, 9 Mar 2015 14:28:31 +0000 (15:28 +0100)
`eq` and `ne` template functions don't work as expected when those are
used with a raw number and a calculated value by add, sub etc. It's
caused by both numbers type differences. For example, `eq 5 (add 2 3)`
returns `false` because raw 5 is `int` while `add 2 3` returns 5 with
`int64`

This normalizes `int`, `uint` and `float` type values to `int64`,
`uint64` and `float64` before comparing them. Other type of value is
passed to comparing function without any changes.

Fix #961

tpl/template.go

index 231946b34ea83e3208f3a55a14b27164eb56a2ca..148ec03c346ae5d21327fdb2ba57cc8ea4eb863a 100644 (file)
@@ -94,6 +94,21 @@ func New() Template {
 }
 
 func Eq(x, y interface{}) bool {
+       normalize := func(v interface{}) interface{} {
+               vv := reflect.ValueOf(v)
+               switch vv.Kind() {
+               case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+                       return vv.Int()
+               case reflect.Float32, reflect.Float64:
+                       return vv.Float()
+               case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+                       return vv.Uint()
+               default:
+                       return v
+               }
+       }
+       x = normalize(x)
+       y = normalize(y)
        return reflect.DeepEqual(x, y)
 }