From 3954160a21bcde7d4f4c077f9cc9daa610f3e29e Mon Sep 17 00:00:00 2001 From: Cameron Moore Date: Tue, 9 May 2017 20:24:23 -0500 Subject: [PATCH] tpl/time: Support overlapping namespace and template func Fixes #3421 --- tpl/time/init.go | 24 +++++++++++++++++++++--- tpl/time/init_test.go | 2 +- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/tpl/time/init.go b/tpl/time/init.go index 33f8a7dbb..9f9cf275f 100644 --- a/tpl/time/init.go +++ b/tpl/time/init.go @@ -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`}, }, diff --git a/tpl/time/init_test.go b/tpl/time/init_test.go index a41d8e4f3..fd49dc4be 100644 --- a/tpl/time/init_test.go +++ b/tpl/time/init_test.go @@ -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{})()) }