tpl/time: Support overlapping namespace and template func

Fixes #3421
This commit is contained in:
Cameron Moore 2017-05-09 20:24:23 -05:00 committed by Bjørn Erik Pedersen
parent 93c5774dd7
commit 3954160a21
2 changed files with 22 additions and 4 deletions

View file

@ -25,8 +25,26 @@ func init() {
ctx := New()
ns := &internal.TemplateFuncsNamespace{
Name: name,
Context: func() interface{} { return ctx },
Name: name,
Context: func(v ...interface{}) interface{} {
// Handle overlapping "time" namespace and func.
//
// If no args are passed to `time`, assume namespace usage and
// return namespace context.
//
// If args are passed, show a deprecation warning and attempt to
// simulate the old "as time" behavior.
if len(v) == 0 {
return ctx
}
t, err := ctx.AsTime(v[0])
if err != nil {
return err
}
return t
},
}
ns.AddMethodMapping(ctx.Format,
@ -42,7 +60,7 @@ func init() {
)
ns.AddMethodMapping(ctx.AsTime,
[]string{"asTime"}, // TODO(bep) handle duplicate
[]string{"asTime"},
[][2]string{
{`{{ (asTime "2015-01-21").Year }}`, `2015`},
},

View file

@ -34,5 +34,5 @@ func TestInit(t *testing.T) {
}
require.True(t, found)
require.IsType(t, &Namespace{}, ns.Context.(func() interface{})())
require.IsType(t, &Namespace{}, ns.Context.(func(v ...interface{}) interface{})())
}