package mysql import ( "database/sql" "errors" mysqldrv "github.com/go-sql-driver/mysql" "code.nochebuena.dev/einherjar/core/xerrors" ) // HandleError maps MySQL driver and database/sql errors to typed [xerrors] values. // Returns nil when err is nil. Also available as [Provider.HandleError]. // // Mapped codes: // - 1062 (ER_DUP_ENTRY) → ErrAlreadyExists // - 1216, 1217, 1451, 1452 (FK errors) → ErrInvalidInput // - sql.ErrNoRows → ErrNotFound // - all others → ErrInternal func HandleError(err error) error { if err == nil { return nil } var mysqlErr *mysqldrv.MySQLError if errors.As(err, &mysqlErr) { switch mysqlErr.Number { case 1062: return xerrors.New(xerrors.ErrAlreadyExists, "record already exists").WithError(err) case 1216, 1217, 1451, 1452: 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) }