From 975f4cf126fa757511a89246cfc14bbf7481b112 Mon Sep 17 00:00:00 2001 From: Tatsushi Demachi Date: Mon, 29 Dec 2014 14:41:59 +0900 Subject: [PATCH] Refactor tpl codes - Use indirect function instead of the same code copies - Fix missing arguments of some test codes --- tpl/template.go | 31 +++++++++---------------------- tpl/template_test.go | 8 ++++---- 2 files changed, 13 insertions(+), 26 deletions(-) diff --git a/tpl/template.go b/tpl/template.go index 1b8107f37..17746fd35 100644 --- a/tpl/template.go +++ b/tpl/template.go @@ -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 diff --git a/tpl/template_test.go b/tpl/template_test.go index 00327ef76..123057afd 100644 --- a/tpl/template_test.go +++ b/tpl/template_test.go @@ -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 {