48 lines
862 B
Go
48 lines
862 B
Go
package handler
|
|
|
|
import (
|
|
"net/http"
|
|
"sync"
|
|
)
|
|
|
|
type Route struct {
|
|
pattern string
|
|
handler func(w http.ResponseWriter, r *http.Request)
|
|
}
|
|
|
|
type baseHandler struct {
|
|
mux *http.ServeMux
|
|
registeredRoutes map[string]bool
|
|
Routes []Route
|
|
}
|
|
|
|
var (
|
|
bh *baseHandler
|
|
bhOnce sync.Once
|
|
bhMu sync.RWMutex
|
|
)
|
|
|
|
func NewBaseHandler(mux *http.ServeMux, routes []Route) *baseHandler {
|
|
bhOnce.Do(func() {
|
|
bh = &baseHandler{
|
|
mux: mux,
|
|
registeredRoutes: make(map[string]bool),
|
|
Routes: routes,
|
|
}
|
|
})
|
|
|
|
bhMu.Lock()
|
|
defer bhMu.Unlock()
|
|
bh.registerRoutes(routes)
|
|
return bh
|
|
}
|
|
|
|
func (b *baseHandler) registerRoutes(routes []Route) {
|
|
for _, route := range routes {
|
|
if !bh.registeredRoutes[route.pattern] {
|
|
b.mux.HandleFunc(route.pattern, route.handler)
|
|
bh.registeredRoutes[route.pattern] = true
|
|
}
|
|
}
|
|
}
|