tpl/collections: Fix apply with namespaced template funcs

We changed the signature to `func(...interface{}) (interface{}, error)` some time ago, but sadly we had no test for this for `apply`. Now we do.

Fixes #9393
This commit is contained in:
Bjørn Erik Pedersen 2022-01-16 22:01:13 +01:00
parent 348d300a71
commit 2655739940
2 changed files with 29 additions and 4 deletions

View file

@ -460,7 +460,6 @@ complex: 80: 80
// Issue 7528
func TestPartialWithZeroedArgs(t *testing.T) {
b := newTestSitesBuilder(t)
b.WithTemplatesAdded("index.html",
`
@ -483,7 +482,6 @@ X123X
X123X
X123X
`)
}
func TestPartialCached(t *testing.T) {
@ -757,3 +755,20 @@ This is single main
`,
)
}
// Issue 9393.
func TestApplyWithNamespace(t *testing.T) {
b := newTestSitesBuilder(t)
b.WithTemplates(
"index.html", `
{{ $b := slice " a " " b " " c" }}
{{ $a := apply $b "strings.Trim" "." " " }}
a: {{ $a }}
`,
).WithContent("p1.md", "")
b.Build(BuildCfg{})
b.AssertFileContent("public/index.html", `a: [a b c]`)
}

View file

@ -111,15 +111,25 @@ func (ns *Namespace) lookupFunc(fname string) (reflect.Value, bool) {
ss := strings.SplitN(fname, ".", 2)
// namespace
// Namespace
nv, found := ns.lookupFunc(ss[0])
if !found {
return reflect.Value{}, false
}
fn, ok := nv.Interface().(func(...interface{}) (interface{}, error))
if !ok {
return reflect.Value{}, false
}
v, err := fn()
if err != nil {
panic(err)
}
nv = reflect.ValueOf(v)
// method
m := nv.MethodByName(ss[1])
// if reflect.DeepEqual(m, reflect.Value{}) {
if m.Kind() == reflect.Invalid {
return reflect.Value{}, false
}