package errorhelpers import ( "fmt" "errors" "git.mmnx.de/Moe/templatehelpers" "github.com/kataras/iris" ) const ( // Error levels ERR_NO_ERR = -1 ERR_LVL_INFORMATION = 0 ERR_LVL_WARNING = 1 ERR_LVL_ERROR = 2 ERR_LVL_FATAL = 3 // User errors ERR_USER_NOT_FOUND = "ERR_USER_NOT_FOUND" ERR_PASSWORD_MISMATCH = "ERR_PASSWORD_MISMATCH" ERR_SESSION_TIMED_OUT = "ERR_SESSION_TIMED_OUT" ERR_INVALID_TOKEN = "ERR_INVALID_TOKEN" ERR_USERNAME_TAKEN = "ERR_USERNAME_TAKEN" ERR_INVALID_PARAM = "ERR_INVALID_PARAM" ERR_NO_CHANGES = "ERR_NO_CHANGES" SUCCESS_LOGIN = "SUCCESS_LOGIN" SUCCESS_LOGOUT = "SUCCESS_LOGOUT" SUCCESS_UPDATE = "SUCCESS_UPDATE" SUCCESS_REGISTER = "SUCCESS_REGISTER" SUCCESS_TOKENS_GENERATED = "SUCCESS_TOKENS_GENERATED" ) type Error struct { err error errLvl int } func(err Error) getErrLvl() int { return err.errLvl } func(err Error) getError() error { return err.err } func MakeError(e interface{}) Error { if e == nil { // check if it's an error return Error{nil, ERR_NO_ERR} } var err error var logLvl int // test for input type if v, isError := e.(error); isError { err = v } else if v, isString := e.(string); isString { err = errors.New(v) } else { fmt.Printf("Error Type not implemented: %T", e) DebugVar(e) DebugVar(&e) } switch err.Error() { // TODO: starts with ? case SUCCESS_LOGIN, SUCCESS_LOGOUT, SUCCESS_TOKENS_GENERATED, SUCCESS_UPDATE, SUCCESS_REGISTER: logLvl = ERR_LVL_INFORMATION default: logLvl = ERR_LVL_ERROR } return Error{err, logLvl} } func DebugVar(v interface{}) { fmt.Printf("%#v\n", v) } func HandleError(e interface{}, ctx *iris.Context) { err := MakeError(e) params := ctx.Get("params").(map[string]string) if err.getError() == nil { // if no error ..., TODO clean this up if len(params["notification"]) < 1 { // if we got one, show a notification ctx.Next() // ... execute next middleware return } else { err = MakeError(params["notification"]) // copy so that we dont get a nil pointer later } } params["notification"] = err.getError().Error() // TODO human readable params["notificationType"] = fmt.Sprintf("%d", err.getErrLvl()) /** Some errors need to be 'redirected' **/ switch err.getError().Error() { case SUCCESS_LOGIN: // open home after login params["reqDir"] = "home" case SUCCESS_LOGOUT, ERR_SESSION_TIMED_OUT, ERR_INVALID_TOKEN: params["reqDir"] = "login" } ctx.Set("params", params) // fmt.Printf("para %#v\n", params) switch err.getErrLvl() { case ERR_LVL_INFORMATION: templatehelpers.ShowNotification(ctx) // TODO: information custom color case ERR_LVL_WARNING: templatehelpers.ShowError(ctx) case ERR_LVL_ERROR: templatehelpers.ShowError(ctx) default: fmt.Print("Not implemented yet: ") ctx.StopExecution() DebugVar(err) } }