package ginutils import ( "net/http" "git.dev.m-and-m.ovh/mderasse/gocommon/aerr" "git.dev.m-and-m.ovh/mderasse/gocommon/constant" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" ) // HandlerFunc represent the type of function expected by the wrapper. type HandlerFunc func(*gin.Context) error // HandlerWrapper will wrap a handler to handle error. func HandlerWrapper(h HandlerFunc) gin.HandlerFunc { return func(c *gin.Context) { err := h(c) if err != nil { errorHandler(c, err) } } } func errorHandler(c *gin.Context, err error) { //nolint: errorlint // Ignore linter to avoid creating useless complexity in the code. switch e := err.(type) { case *aerr.Error: log := GetLoggerWithFields(c, logrus.Fields{ string(constant.LogField_Error): e.Error(), string(constant.LogField_ErrorCode): e.Code, }) log.Warn("An error occurred") if e.DebugId == "" { e = e.SetDebugID(c.GetString(string(constant.ContextKey_RequestID))) } c.AbortWithStatusJSON(e.HttpCode(), e) default: log := GetLoggerWithFields(c, logrus.Fields{ string(constant.LogField_Error): e.Error(), string(constant.LogField_ErrorCode): "500", }) log.Warn("An error occurred") c.AbortWithStatusJSON(http.StatusInternalServerError, aerr.Error{ Msg: e.Error(), Code: 500, DebugId: c.GetString(string(constant.ContextKey_RequestID)), }) } }