diff options
author | 2019-12-17 15:01:15 +0100 | |
---|---|---|
committer | 2019-12-17 15:01:15 +0100 | |
commit | ca3672df2ad75cbb866b08ca79320a75e30a55ce (patch) | |
tree | 72bd0406d61d5e64e36c90a79c3e6e511c490fd8 /template.go | |
parent | d8a875a5f74f90c2ca52c61e72ddb88f78d97277 (diff) | |
download | alps-ca3672df2ad75cbb866b08ca79320a75e30a55ce.tar.gz alps-ca3672df2ad75cbb866b08ca79320a75e30a55ce.tar.bz2 alps-ca3672df2ad75cbb866b08ca79320a75e30a55ce.zip |
Add RenderData interface
This allows Go plugins to easily inject global data.
Diffstat (limited to 'template.go')
-rw-r--r-- | template.go | 44 |
1 files changed, 37 insertions, 7 deletions
diff --git a/template.go b/template.go index 379b6d5..6286e08 100644 --- a/template.go +++ b/template.go @@ -20,18 +20,48 @@ type GlobalRenderData struct { Username string // TODO: list of mailboxes - // Additional plugin-specific data + // additional plugin-specific data Extra map[string]interface{} } // BaseRenderData is the base type for templates. It should be extended with -// new template-specific fields. +// additional template-specific fields: +// +// type MyRenderData struct { +// BaseRenderData +// // add additional fields here +// } type BaseRenderData struct { - Global GlobalRenderData - // Additional plugin-specific data + GlobalData GlobalRenderData + // additional plugin-specific data Extra map[string]interface{} } +// Global implements RenderData. +func (brd *BaseRenderData) Global() *GlobalRenderData { + return &brd.GlobalData +} + +// RenderData is implemented by template data structs. It can be used to inject +// additional data to all templates. +type RenderData interface { + // GlobalData returns a pointer to the global render data. + Global() *GlobalRenderData +} + +// NewBaseRenderData initializes a new BaseRenderData. +// +// It can be used by routes to pre-fill the base data: +// +// type MyRenderData struct { +// BaseRenderData +// // add additional fields here +// } +// +// data := &MyRenderData{ +// BaseRenderData: *koushin.NewBaseRenderData(ctx), +// // other fields... +// } func NewBaseRenderData(ctx *Context) *BaseRenderData { global := GlobalRenderData{Extra: make(map[string]interface{})} @@ -41,8 +71,8 @@ func NewBaseRenderData(ctx *Context) *BaseRenderData { } return &BaseRenderData{ - Global: global, - Extra: make(map[string]interface{}), + GlobalData: global, + Extra: make(map[string]interface{}), } } @@ -57,7 +87,7 @@ func (r *renderer) Render(w io.Writer, name string, data interface{}, ectx echo. ctx := ectx.Get("context").(*Context) for _, plugin := range ctx.Server.Plugins { - if err := plugin.Inject(name, data); err != nil { + if err := plugin.Inject(name, data.(RenderData)); err != nil { return fmt.Errorf("failed to run plugin '%v': %v", plugin.Name(), err) } } |