From fdad4101f5b829374490732cfb9bd8f6e29a8bca Mon Sep 17 00:00:00 2001 From: Olakunle Arewa Date: Wed, 17 Apr 2024 20:15:30 +0100 Subject: [PATCH] feat: html server and template wrapper --- html/files.go | 15 +++++++++++ html/template.go | 68 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 html/files.go create mode 100644 html/template.go diff --git a/html/files.go b/html/files.go new file mode 100644 index 0000000..4348c69 --- /dev/null +++ b/html/files.go @@ -0,0 +1,15 @@ +package html + +import ( + "net/http" + + "github.com/go-chi/chi/v5" +) + +// Server creates route for routing requests for static files +func Server(router *chi.Mux, folder string) { + fs := http.FileServer(http.Dir("./" + folder)) + handler := http.StripPrefix("/"+folder+"/", fs) + + router.Get("/"+folder+"/*", handler.ServeHTTP) +} diff --git a/html/template.go b/html/template.go new file mode 100644 index 0000000..d9adbcf --- /dev/null +++ b/html/template.go @@ -0,0 +1,68 @@ +package html + +import ( + "bytes" + jsonslow "encoding/json" + "html/template" + "net/http" + + "github.com/noxecane/anansi" + "github.com/noxecane/anansi/json" + "github.com/rs/zerolog" +) + +type Template interface { + Render(*http.Request, http.ResponseWriter, any) error +} + +type htmlTemplate struct { + name string + tmpl *template.Template +} + +func Parse(name string, source ...string) Template { + var tmpl *template.Template + if len(source) == 1 { + tmpl = template.Must(template.New(name).ParseFiles(source...)) + } else if len(source) > 0 { + tmpl = template.Must(template.ParseFiles(source...)) + } else { + panic("souce can't be empty") + } + + return &htmlTemplate{name, tmpl} +} + +func (t *htmlTemplate) Render(r *http.Request, w http.ResponseWriter, data any) error { + log := zerolog.Ctx(r.Context()) + raw, err := json.Marshal(data) + + if data != nil { + log.UpdateContext(func(ctx zerolog.Context) zerolog.Context { + buffer := new(bytes.Buffer) + if err != nil { + panic(err) + } + + if err := jsonslow.Compact(buffer, raw); err != nil { + panic(err) + } + + return ctx.RawJSON("html_data", buffer.Bytes()) + }) + } + + err = t.tmpl.ExecuteTemplate(w, t.name, data) + + if err == nil { + log.Info(). + Interface("response_headers", anansi.SimpleHeaders(w.Header())). + Msg("") + } else { + log.Err(err). + Interface("response_headers", anansi.SimpleHeaders(w.Header())). + Msg("") + } + + return err +}