aboutsummaryrefslogtreecommitdiff
path: root/template.go
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2020-01-08 10:52:28 +0100
committerSimon Ser <contact@emersion.fr>2020-01-08 10:52:28 +0100
commit97b314b6e7854612a2be31b2c46ad8907456551b (patch)
treedd4fbfd2efa72d241ac2d0d91c9a9791db593874 /template.go
parentf6758264b2448771d3d7a6b85937c13b57888e81 (diff)
downloadalps-97b314b6e7854612a2be31b2c46ad8907456551b.tar.gz
alps-97b314b6e7854612a2be31b2c46ad8907456551b.zip
Add Server.Reload
This only reloads templates for now. In the future it'll also reload Lua plugins.
Diffstat (limited to 'template.go')
-rw-r--r--template.go40
1 files changed, 27 insertions, 13 deletions
diff --git a/template.go b/template.go
index 4b46d84..3502a3b 100644
--- a/template.go
+++ b/template.go
@@ -6,6 +6,7 @@ import (
"io"
"io/ioutil"
"os"
+ "sync"
"github.com/labstack/echo/v4"
)
@@ -77,12 +78,18 @@ func NewBaseRenderData(ctx *Context) *BaseRenderData {
}
type renderer struct {
- base *template.Template
- themes map[string]*template.Template
+ logger echo.Logger
defaultTheme string
+
+ mutex sync.RWMutex
+ base *template.Template
+ themes map[string]*template.Template
}
func (r *renderer) Render(w io.Writer, name string, data interface{}, ectx echo.Context) error {
+ r.mutex.RLock()
+ defer r.mutex.RUnlock()
+
// ectx is the raw *echo.context, not our own *Context
ctx := ectx.Get("context").(*Context)
@@ -114,12 +121,12 @@ func loadTheme(name string, base *template.Template) (*template.Template, error)
return theme, nil
}
-func loadTemplates(logger echo.Logger, defaultTheme string, plugins []Plugin) (*renderer, error) {
+func (r *renderer) reload(plugins []Plugin) error {
base := template.New("")
for _, p := range plugins {
if err := p.LoadTemplate(base); err != nil {
- return nil, fmt.Errorf("failed to load template for plugin '%v': %v", p.Name(), err)
+ return fmt.Errorf("failed to load template for plugin '%v': %v", p.Name(), err)
}
}
@@ -127,7 +134,7 @@ func loadTemplates(logger echo.Logger, defaultTheme string, plugins []Plugin) (*
files, err := ioutil.ReadDir(themesDir)
if err != nil && !os.IsNotExist(err) {
- return nil, err
+ return err
}
for _, fi := range files {
@@ -135,22 +142,29 @@ func loadTemplates(logger echo.Logger, defaultTheme string, plugins []Plugin) (*
continue
}
- logger.Printf("Loading theme '%v'", fi.Name())
+ r.logger.Printf("Loading theme '%v'", fi.Name())
var err error
if themes[fi.Name()], err = loadTheme(fi.Name(), base); err != nil {
- return nil, fmt.Errorf("failed to load theme '%v': %v", fi.Name(), err)
+ return fmt.Errorf("failed to load theme '%v': %v", fi.Name(), err)
}
}
- if defaultTheme != "" {
- if _, ok := themes[defaultTheme]; !ok {
- return nil, fmt.Errorf("failed to find default theme '%v'", defaultTheme)
+ if r.defaultTheme != "" {
+ if _, ok := themes[r.defaultTheme]; !ok {
+ return fmt.Errorf("failed to find default theme '%v'", r.defaultTheme)
}
}
+ r.mutex.Lock()
+ r.base = base
+ r.themes = themes
+ r.mutex.Unlock()
+ return nil
+}
+
+func newRenderer(logger echo.Logger, defaultTheme string) *renderer {
return &renderer{
- base: base,
- themes: themes,
+ logger: logger,
defaultTheme: defaultTheme,
- }, nil
+ }
}