package common import ( "log/slog" "net/http" "forge.cadoles.com/wpetit/clearcase/internal/http/handler/webui/common/component" "github.com/a-h/templ" "github.com/pkg/errors" ) type HTTPError interface { error StatusCode() int } type UserFacingError interface { error UserMessage() string } func HandleError(w http.ResponseWriter, r *http.Request, err error) { vmodel := component.ErrorPageVModel{} statusCode := http.StatusInternalServerError var httpErr HTTPError if errors.As(err, &httpErr) { statusCode = httpErr.StatusCode() } w.WriteHeader(statusCode) var userFacingErr UserFacingError if errors.As(err, &userFacingErr) { vmodel.Message = userFacingErr.UserMessage() } else { vmodel.Message = http.StatusText(statusCode) } if httpErr == nil && userFacingErr == nil { slog.ErrorContext(r.Context(), "unexpected error", slog.Any("error", errors.WithStack(err))) } errorPage := component.ErrorPage(vmodel) templ.Handler(errorPage).ServeHTTP(w, r) }