diff options
| author | Gabriel A. Giovanini <mail@gabrielgio.me> | 2024-06-08 00:01:44 +0200 | 
|---|---|---|
| committer | Gabriel A. Giovanini <mail@gabrielgio.me> | 2024-06-08 00:01:44 +0200 | 
| commit | 6079b1d963f34ada5c4b25363f2319901e283936 (patch) | |
| tree | f7f93616eb3dacfcebee486fe7542ec3adfb3950 /pkg/ext/router.go | |
| parent | e9098e00fb6339b759df5b0df2e086cef8a7ce83 (diff) | |
| download | cerrado-6079b1d963f34ada5c4b25363f2319901e283936.tar.gz cerrado-6079b1d963f34ada5c4b25363f2319901e283936.tar.bz2 cerrado-6079b1d963f34ada5c4b25363f2319901e283936.zip  | |
feat: Add error handling
Diffstat (limited to 'pkg/ext/router.go')
| -rw-r--r-- | pkg/ext/router.go | 72 | 
1 files changed, 72 insertions, 0 deletions
diff --git a/pkg/ext/router.go b/pkg/ext/router.go new file mode 100644 index 0000000..5d22814 --- /dev/null +++ b/pkg/ext/router.go @@ -0,0 +1,72 @@ +package ext + +import ( +	"errors" +	"fmt" +	"net/http" + +	"git.gabrielgio.me/cerrado/pkg/service" +	"git.gabrielgio.me/cerrado/templates" +) + +type ( +	Router struct { +		middlewares []Middleware +		router      *http.ServeMux +	} +	Middleware          func(next http.HandlerFunc) http.HandlerFunc +	ErrorRequestHandler func(w http.ResponseWriter, r *http.Request) error +) + +func NewRouter() *Router { +	return &Router{ +		router: http.NewServeMux(), +	} +} +func (r *Router) Handler() http.Handler { +	return r.router +} + +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 { +			if errors.Is(err, service.RepositoryNotFoundErr) { +				NotFound(w) +			} else { +				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) HandleFunc(path string, handler ErrorRequestHandler) { +	r.router.HandleFunc(path, r.run(handler)) +} + +func NotFound(w http.ResponseWriter) { +	w.WriteHeader(http.StatusNotFound) +	templates.WritePageTemplate(w, &templates.ErrorPage{ +		Message: "Not Found", +	}) +} + +func InternalServerError(w http.ResponseWriter, err error) { +	w.WriteHeader(http.StatusInternalServerError) +	templates.WritePageTemplate(w, &templates.ErrorPage{ +		Message: fmt.Sprintf("Internal Server Error:\n%s", err.Error()), +	}) +}  | 
