// backend/util.go package main import ( "encoding/json" "log" "net/http" "os" "strings" ) func writeJSON(w http.ResponseWriter, v any) { w.Header().Set("Content-Type", "application/json") if err := json.NewEncoder(w).Encode(v); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func env(k, def string) string { if v := os.Getenv(k); v != "" { return v } return def } func must(err error, msg string) { if err != nil { log.Fatalf("%s: %v", msg, err) } } func contains(ss []string, v string) bool { for _, s := range ss { if s == v { return true } } return false } func sanitizeSegment(s string) string { s = strings.TrimSpace(s) s = strings.ReplaceAll(s, " ", "_") s = strings.Trim(s, "/") if i := strings.IndexByte(s, '/'); i >= 0 { s = s[:i] } out := make([]rune, 0, len(s)) for _, r := range s { switch { case r >= 'a' && r <= 'z', r >= 'A' && r <= 'Z', r >= '0' && r <= '9', r == '_', r == '-', r == '.': out = append(out, r) default: out = append(out, '_') } } if len(out) > 64 { out = out[:64] } return string(out) }