summaryrefslogtreecommitdiff
path: root/pages/page.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--pages/page.go58
1 files changed, 58 insertions, 0 deletions
diff --git a/pages/page.go b/pages/page.go
new file mode 100644
index 0000000..25c2331
--- /dev/null
+++ b/pages/page.go
@@ -0,0 +1,58 @@
+package pages
+
+import (
+ "context"
+ "gosten/model"
+ "gosten/templ"
+ "log"
+ "net/http"
+
+ "github.com/go-chi/chi/v5"
+)
+
+var Q *model.Queries
+
+func Connect(tx model.DBTX) {
+ Q = model.New(tx)
+}
+
+type Page interface {
+ http.Handler
+}
+
+type dataFunc func(r *http.Request, uid int32) any
+
+type simplePage struct {
+ dataFn dataFunc
+ template string
+}
+
+func (p simplePage) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ input := p.dataFn(r, userId(r))
+ p.showTemplate(w, input)
+}
+
+func simpleByQuery[T any](tpl string, query func(ctx context.Context, id int32) (T, error)) Page {
+ dataFn := func(r *http.Request, uid int32) any {
+ d, _ := query(r.Context(), uid)
+ return d
+ }
+ return simple(tpl, dataFn)
+}
+
+func simple(tpl string, dataFn dataFunc) Page {
+ p := simplePage{dataFn, tpl}
+ r := chi.NewRouter()
+ r.Get("/", p.ServeHTTP)
+ return r
+}
+
+func showTemplate(w http.ResponseWriter, tpl string, data any) {
+ if err := templ.Lookup(tpl).Execute(w, data); err != nil {
+ log.Panicf("Executing '%s' with %+v: %v", tpl, data, err)
+ }
+}
+
+func (p simplePage) showTemplate(w http.ResponseWriter, data any) {
+ showTemplate(w, p.template, data)
+}