Files
qwqcode e050544d21 refactor(renderer): abstract func of template renderer for multi-cases (#585)
* refactor(email_renderer): abstract function of template renderer for multi-cases

* abstract template loader

* add render test

* update docs

* chore: move pkg to template

* abstract template pkg
2023-09-20 12:10:20 +08:00

68 lines
1.4 KiB
Go

package template
import (
"github.com/ArtalkJS/Artalk/internal/dao"
"github.com/ArtalkJS/Artalk/internal/entity"
)
type RenderType string
const (
TYPE_EMAIL RenderType = "email"
TYPE_NOTIFY RenderType = "notify"
)
type RenderStrategy interface {
Render(tpl string, p tplParams, notify *entity.Notify, extra notifyExtraData) string
}
type Renderer struct {
dao *dao.Dao
strategy RenderStrategy
defaultTpl string
}
func (r *Renderer) Render(notify *entity.Notify, customTpl ...string) string {
var tpl string
if len(customTpl) > 0 {
tpl = customTpl[0]
} else {
tpl = r.defaultTpl
}
extra := getNotifyExtraData(r.dao, notify)
params := getCommonParams(r.dao, notify, extra)
return r.strategy.Render(tpl, params, notify, extra)
}
func NewRenderer(dao *dao.Dao, renderType RenderType, defaultTemplateLoader TemplateLoader) *Renderer {
r := &Renderer{
dao: dao,
}
// load default template
if defaultTemplateLoader != nil {
r.defaultTpl = defaultTemplateLoader.Load(renderType)
}
// Render type
var renderStrategies = map[RenderType]func() RenderStrategy{
TYPE_EMAIL: func() RenderStrategy {
return NewEmailRenderStrategy()
},
TYPE_NOTIFY: func() RenderStrategy {
return NewNotifyRenderer()
},
}
// Set render strategy
if strategyFunc, ok := renderStrategies[renderType]; ok {
r.strategy = strategyFunc()
} else {
r.strategy = NewEmailRenderStrategy() // Default
}
return r
}