diff options
author | Tatsushi Demachi <tdemachi@gmail.com> | 2014-12-29 08:41:59 +0300 |
---|---|---|
committer | bep <bjorn.erik.pedersen@gmail.com> | 2014-12-29 17:47:50 +0300 |
commit | 975f4cf126fa757511a89246cfc14bbf7481b112 (patch) | |
tree | a44ea165cff1a00fb955c9433cfb4a9b38d9a084 /tpl | |
parent | fa8ac87d5edfe3435e21579d19e86bba3be2089c (diff) |
Refactor tpl codes
- Use indirect function instead of the same code copies
- Fix missing arguments of some test codes
Diffstat (limited to 'tpl')
-rw-r--r-- | tpl/template.go | 31 | ||||
-rw-r--r-- | 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 { |