1
0
mirror of https://github.com/golang/go synced 2024-11-25 07:17:56 -07:00

exp/template: add builtin len function

R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/4868045
This commit is contained in:
Rob Pike 2011-08-12 11:47:44 +10:00
parent 2e394c51d9
commit b1d1da405a
3 changed files with 24 additions and 0 deletions

View File

@ -232,6 +232,8 @@ Predefined global functions are named as follows.
js js
Returns the escaped JavaScript equivalent of the textual Returns the escaped JavaScript equivalent of the textual
representation of its arguments. representation of its arguments.
len
Returns the integer length of its argument.
not not
Returns the boolean negation of its single argument. Returns the boolean negation of its single argument.
or or

View File

@ -331,6 +331,12 @@ var execTests = []execTest{
{"map[WRONG]", "{{index .MSI 10}}", "", tVal, false}, {"map[WRONG]", "{{index .MSI 10}}", "", tVal, false},
{"double index", "{{index .SMSI 1 `eleven`}}", "11", tVal, true}, {"double index", "{{index .SMSI 1 `eleven`}}", "11", tVal, true},
// Len.
{"slice", "{{len .SI}}", "3", tVal, true},
{"map", "{{len .MSI }}", "3", tVal, true},
{"len of int", "{{len 3}}", "", tVal, false},
{"len of nothing", "{{len .Empty0}}", "", tVal, false},
// With. // With.
{"with true", "{{with true}}{{.}}{{end}}", "true", tVal, true}, {"with true", "{{with true}}{{.}}{{end}}", "true", tVal, true},
{"with false", "{{with false}}{{.}}{{else}}FALSE{{end}}", "FALSE", tVal, true}, {"with false", "{{with false}}{{.}}{{else}}FALSE{{end}}", "FALSE", tVal, true},

View File

@ -27,6 +27,7 @@ var builtins = FuncMap{
"html": HTMLEscaper, "html": HTMLEscaper,
"index": index, "index": index,
"js": JSEscaper, "js": JSEscaper,
"len": length,
"not": not, "not": not,
"or": or, "or": or,
"print": fmt.Sprint, "print": fmt.Sprint,
@ -140,6 +141,21 @@ func index(item interface{}, indices ...interface{}) (interface{}, os.Error) {
return v.Interface(), nil return v.Interface(), nil
} }
// Length
// length returns the length of the item, with an error if it has no defined length.
func length(item interface{}) (int, os.Error) {
v, isNil := indirect(reflect.ValueOf(item))
if isNil {
return 0, fmt.Errorf("len of nil pointer")
}
switch v.Kind() {
case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice, reflect.String:
return v.Len(), nil
}
return 0, fmt.Errorf("len of type %s", v.Type())
}
// Boolean logic. // Boolean logic.
func truth(a interface{}) bool { func truth(a interface{}) bool {