From 29e0879dd988d7467f5e28ec9673fd8f436cc5f0 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Tue, 17 Dec 2019 13:23:10 +0100 Subject: [PATCH] Allow Go Plugins to inject template data --- plugin_go.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/plugin_go.go b/plugin_go.go index cbfe8ee..43e9aea 100644 --- a/plugin_go.go +++ b/plugin_go.go @@ -41,6 +41,14 @@ func (p *goPlugin) SetRoutes(group *echo.Group) { } func (p *goPlugin) Inject(name string, data interface{}) error { + if f, ok := p.p.injectFuncs["*"]; ok { + if err := f(data); err != nil { + return err + } + } + if f, ok := p.p.injectFuncs[name]; ok { + return f(data) + } return nil } @@ -67,6 +75,7 @@ type GoPlugin struct { routes []goPluginRoute templateFuncs template.FuncMap + injectFuncs map[string]InjectFunc } // AddRoute registers a new HTTP route. @@ -104,6 +113,18 @@ func (p *GoPlugin) TemplateFuncs(funcs template.FuncMap) { } } +// InjectFunc is a function that injects data prior to rendering a template. +type InjectFunc func(data interface{}) error + +// Inject registers a function to execute prior to rendering a template. The +// special name "*" matches any template. +func (p *GoPlugin) Inject(name string, f InjectFunc) { + if p.injectFuncs == nil { + p.injectFuncs = make(map[string]InjectFunc) + } + p.injectFuncs[name] = f +} + // Plugin returns an object implementing Plugin. func (p *GoPlugin) Plugin() Plugin { return &goPlugin{p}