diff options
Diffstat (limited to 'templ/template.go')
-rw-r--r-- | templ/template.go | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/templ/template.go b/templ/template.go new file mode 100644 index 0000000..8fed965 --- /dev/null +++ b/templ/template.go @@ -0,0 +1,45 @@ +package templ + +import ( + "embed" + "html/template" + "sync" +) + +//go:embed *.tpl +var fs embed.FS + +var templates = make(map[string]*template.Template) +var muTpl sync.RWMutex + +var baseTpl *template.Template + +func init() { + baseTpl = template.Must(template.ParseFS(fs, "base.tpl")) +} + +func Lookup(name string) *template.Template { + muTpl.RLock() + tpl := templates[name] + muTpl.RUnlock() + + if tpl == nil { + return parse(name) + } + return tpl +} + +func parse(name string) *template.Template { + muTpl.Lock() + defer muTpl.Unlock() + + if tpl := templates[name]; tpl != nil { + // might've been created by another goroutine + return tpl + } + + b := template.Must(baseTpl.Clone()) + t := template.Must(b.ParseFS(fs, name+".tpl")) + templates[name] = t + return t +} |