summaryrefslogtreecommitdiffhomepage
path: root/middleware
diff options
context:
space:
mode:
Diffstat (limited to 'middleware')
-rw-r--r--middleware/pipe.go14
-rw-r--r--middleware/theme.go42
2 files changed, 56 insertions, 0 deletions
diff --git a/middleware/pipe.go b/middleware/pipe.go
new file mode 100644
index 0000000..4b5064d
--- /dev/null
+++ b/middleware/pipe.go
@@ -0,0 +1,14 @@
+package middleware
+
+import "net/http"
+
+type Middleware func(http.Handler) http.Handler
+
+func Pipe(xs ...Middleware) Middleware {
+ return func(next http.Handler) http.Handler {
+ for i := len(xs) - 1; i >= 0; i-- {
+ next = xs[i](next)
+ }
+ return next
+ }
+}
diff --git a/middleware/theme.go b/middleware/theme.go
new file mode 100644
index 0000000..4f14c97
--- /dev/null
+++ b/middleware/theme.go
@@ -0,0 +1,42 @@
+package middleware
+
+import (
+ "cmp"
+ "context"
+ "math"
+ "net/http"
+)
+
+const defaultTheme = "dark"
+
+func Theme(next http.Handler) http.Handler {
+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ var userTheme string
+
+ /* Grab the ‘theme’ cookie to figure out what the users current
+ theme is and add it to the context. If the user doesn’t yet
+ have a theme cookie or the cookie they have contains an
+ invalid theme then we fallback to the default theme and
+ (re)set the cookie. */
+
+ c, err := r.Cookie("theme")
+ if err == nil {
+ switch c.Value {
+ case "dark", "light":
+ userTheme = c.Value
+ }
+ }
+
+ theme := cmp.Or(userTheme, defaultTheme)
+ if userTheme == "" {
+ http.SetCookie(w, &http.Cookie{
+ Name: "theme",
+ Value: theme,
+ MaxAge: math.MaxInt32,
+ })
+ }
+
+ ctx := context.WithValue(r.Context(), "theme", theme)
+ next.ServeHTTP(w, r.WithContext(ctx))
+ })
+}