package models import ( "database/sql" "golang.org/x/crypto/bcrypt" ) type notFoundError struct { error } func (e *notFoundError) NotFound() bool { return true } // IsNotFoundError returns true if the model deems it a not found error. func IsNotFoundError(err error) bool { type notFound interface { NotFound() bool } te, ok := err.(notFound) return ok && te.NotFound() } func wrapNotFound(err error) error { if err == sql.ErrNoRows { return ¬FoundError{error: err} } return err } type invalidLoginError struct { error } func (e *invalidLoginError) InvalidLogin() bool { return true } // IsInvalidLoginError returns true if the model deems it an invalid login error. func IsInvalidLoginError(err error) bool { type invalidLogin interface { InvalidLogin() bool } te, ok := err.(invalidLogin) return ok && te.InvalidLogin() } func wrapInvalidLogin(err error) error { if err == sql.ErrNoRows || err == bcrypt.ErrMismatchedHashAndPassword { return &invalidLoginError{error: err} } return err }