go-tools/app/mailadm/mailadm.go
2023-07-15 08:35:45 -06:00

75 lines
1.3 KiB
Go

package mailadm
import (
"embed"
"io/fs"
"log"
"net/http"
"strconv"
"text/template"
"go.sour.is/pkg/lg"
)
var (
//go:embed pages/* layouts/*
files embed.FS
templates map[string]*template.Template
)
type mailadm struct{}
func New() *mailadm {
return &mailadm{}
}
func (s *mailadm) RegisterHTTP(mux *http.ServeMux) {
mux.Handle("/mailadm/", lg.Htrace(s, "mailadm"))
s.loadTemplates()
}
func (s *mailadm) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/mailadm/clicked" {
templates["edit.go.tpl"].Execute(w, r.URL.Query())
return
}
templates["home.go.tpl"].Execute(w, nil)
}
var funcMap = map[string]any{
"addone": func(s string) string {
if i, err := strconv.Atoi(s); err == nil {
return strconv.Itoa(i + 1)
}
return s
},
}
func (s *mailadm) loadTemplates() error {
if templates != nil {
return nil
}
templates = make(map[string]*template.Template)
tmplFiles, err := fs.ReadDir(files, "pages")
if err != nil {
return err
}
for _, tmpl := range tmplFiles {
if tmpl.IsDir() {
continue
}
pt := template.New(tmpl.Name())
pt.Funcs(funcMap)
pt, err = pt.ParseFS(files, "pages/"+tmpl.Name(), "layouts/*.go.tpl")
if err != nil {
log.Println(err)
return err
}
templates[tmpl.Name()] = pt
}
return nil
}