Refactor tpl codes
authorTatsushi Demachi <tdemachi@gmail.com>
Mon, 29 Dec 2014 05:41:59 +0000 (14:41 +0900)
committerbep <bjorn.erik.pedersen@gmail.com>
Mon, 29 Dec 2014 14:47:50 +0000 (15:47 +0100)
- Use indirect function instead of the same code copies
- Fix missing arguments of some test codes

tpl/template.go
tpl/template_test.go

index 1b8107f37ff9fc8055546bcd98badc935c8e607b..17746fd3544834d87abcf0423a7e6f967867c0b1 100644 (file)
@@ -317,14 +317,9 @@ func First(limit interface{}, seq interface{}) (interface{}, error) {
        }
 
        seqv := reflect.ValueOf(seq)
-       // this is better than my first pass; ripped from text/template/exec.go indirect():
-       for ; seqv.Kind() == reflect.Ptr || seqv.Kind() == reflect.Interface; seqv = seqv.Elem() {
-               if seqv.IsNil() {
-                       return nil, errors.New("can't iterate over a nil value")
-               }
-               if seqv.Kind() == reflect.Interface && seqv.NumMethod() > 0 {
-                       break
-               }
+       seqv, isNil := indirect(seqv)
+       if isNil {
+               return nil, errors.New("can't iterate over a nil value")
        }
 
        switch seqv.Kind() {
@@ -477,13 +472,9 @@ func Delimit(seq, delimiter interface{}, last ...interface{}) (template.HTML, er
        }
 
        seqv := reflect.ValueOf(seq)
-       for ; seqv.Kind() == reflect.Ptr || seqv.Kind() == reflect.Interface; seqv = seqv.Elem() {
-               if seqv.IsNil() {
-                       return "", errors.New("can't iterate over a nil value")
-               }
-               if seqv.Kind() == reflect.Interface && seqv.NumMethod() > 0 {
-                       break
-               }
+       seqv, isNil := indirect(seqv)
+       if isNil {
+               return "", errors.New("can't iterate over a nil value")
        }
 
        var str string
@@ -521,13 +512,9 @@ func Delimit(seq, delimiter interface{}, last ...interface{}) (template.HTML, er
 
 func Sort(seq interface{}, args ...interface{}) ([]interface{}, error) {
        seqv := reflect.ValueOf(seq)
-       for ; seqv.Kind() == reflect.Ptr || seqv.Kind() == reflect.Interface; seqv = seqv.Elem() {
-               if seqv.IsNil() {
-                       return nil, errors.New("can't iterate over a nil value")
-               }
-               if seqv.Kind() == reflect.Interface && seqv.NumMethod() > 0 {
-                       break
-               }
+       seqv, isNil := indirect(seqv)
+       if isNil {
+               return nil, errors.New("can't iterate over a nil value")
        }
 
        // Create a list of pairs that will be used to do the sort
index 00327ef7683e60cb5f15b0a02ecfa831d20afbc0..123057afdce31f1f58e0d5b57b5124362930ec79 100644 (file)
@@ -112,7 +112,7 @@ func TestDoArithmetic(t *testing.T) {
                result, err := doArithmetic(this.a, this.b, this.op)
                if b, ok := this.expect.(bool); ok && !b {
                        if err == nil {
-                               t.Errorf("[%d] doArithmetic didn't return an expected error")
+                               t.Errorf("[%d] doArithmetic didn't return an expected error", i)
                        }
                } else {
                        if err != nil {
@@ -147,7 +147,7 @@ func TestMod(t *testing.T) {
                result, err := Mod(this.a, this.b)
                if b, ok := this.expect.(bool); ok && !b {
                        if err == nil {
-                               t.Errorf("[%d] modulo didn't return an expected error")
+                               t.Errorf("[%d] modulo didn't return an expected error", i)
                        }
                } else {
                        if err != nil {
@@ -187,7 +187,7 @@ func TestModBool(t *testing.T) {
                result, err := ModBool(this.a, this.b)
                if this.expect == nil {
                        if err == nil {
-                               t.Errorf("[%d] modulo didn't return an expected error")
+                               t.Errorf("[%d] modulo didn't return an expected error", i)
                        }
                } else {
                        if err != nil {
@@ -218,7 +218,7 @@ func TestFirst(t *testing.T) {
                results, err := First(this.count, this.sequence)
                if b, ok := this.expect.(bool); ok && !b {
                        if err == nil {
-                               t.Errorf("[%d] First didn't return an expected error")
+                               t.Errorf("[%d] First didn't return an expected error", i)
                        }
                } else {
                        if err != nil {