aboutsummaryrefslogtreecommitdiffstats
path: root/template.go
diff options
context:
space:
mode:
authorLibravatarLibravatar Simon Ser <[email protected]> 2019-12-17 15:01:15 +0100
committerLibravatarLibravatar Simon Ser <[email protected]> 2019-12-17 15:01:15 +0100
commitca3672df2ad75cbb866b08ca79320a75e30a55ce (patch)
tree72bd0406d61d5e64e36c90a79c3e6e511c490fd8 /template.go
parentd8a875a5f74f90c2ca52c61e72ddb88f78d97277 (diff)
downloadalps-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.go44
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)
}
}