package mysql import ( "database/sql" "errors" mysqldrv "github.com/go-sql-driver/mysql" "code.nochebuena.dev/go/xerrors" ) // HandleError maps MySQL and database/sql errors to xerrors types. // Also available as client.HandleError(err). func HandleError(err error) error { if err == nil { return nil } var mysqlErr *mysqldrv.MySQLError if errors.As(err, &mysqlErr) { switch mysqlErr.Number { case 1062: // ER_DUP_ENTRY return xerrors.New(xerrors.ErrAlreadyExists, "record already exists").WithError(err) case 1216, 1217, 1451, 1452: // foreign key violations return xerrors.New(xerrors.ErrInvalidInput, "data integrity violation").WithError(err) } } if errors.Is(err, sql.ErrNoRows) { return xerrors.New(xerrors.ErrNotFound, "record not found").WithError(err) } return xerrors.New(xerrors.ErrInternal, "unexpected database error").WithError(err) }