shithub: hugo

Download patch

ref: 975f4cf126fa757511a89246cfc14bbf7481b112
parent: fa8ac87d5edfe3435e21579d19e86bba3be2089c
author: Tatsushi Demachi <[email protected]>
date: Mon Dec 29 09:41:59 EST 2014

Refactor tpl codes

- Use indirect function instead of the same code copies
- Fix missing arguments of some test codes

--- a/tpl/template.go
+++ b/tpl/template.go
@@ -317,14 +317,9 @@
 	}
 
 	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 @@
 	}
 
 	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 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
--- a/tpl/template_test.go
+++ b/tpl/template_test.go
@@ -112,7 +112,7 @@
 		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 @@
 		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 @@
 		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 @@
 		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 {