From 97b314b6e7854612a2be31b2c46ad8907456551b Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Wed, 8 Jan 2020 10:52:28 +0100 Subject: Add Server.Reload This only reloads templates for now. In the future it'll also reload Lua plugins. --- template.go | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) (limited to 'template.go') 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 + } } -- cgit v1.2.3