package ext import ( "net/http" "github.com/gorilla/mux" ) type ( Router struct { middlewares []Middleware router *mux.Router } Middleware func(next http.HandlerFunc) http.HandlerFunc ErrorRequestHandler func(w http.ResponseWriter, r *http.Request) error ) func NewRouter(nestedRouter *mux.Router) *Router { return &Router{ router: nestedRouter, } } func (r *Router) AddMiddleware(middleware Middleware) { r.middlewares = append(r.middlewares, middleware) } func wrapError(next ErrorRequestHandler) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { if err := next(w, r); err != nil { w.WriteHeader(http.StatusInternalServerError) InternalServerError(w, err) } } } func (r *Router) run(next ErrorRequestHandler) http.HandlerFunc { return func(w http.ResponseWriter, re *http.Request) { req := wrapError(next) for _, r := range r.middlewares { req = r(req) } req(w, re) } } func (r *Router) GET(path string, handler ErrorRequestHandler) { r.router.HandleFunc(path, r.run(handler)).Methods("GET") } func (r *Router) POST(path string, handler ErrorRequestHandler) { r.router.HandleFunc(path, r.run(handler)).Methods("POSt") }