tryMap method

  1. @override
Failure? tryMap(
  1. Object error, [
  2. StackTrace? stackTrace
])
override

Пытается преобразовать error в Failure, если ошибка связана с Drift/SQLite.

Определяет принадлежность к Drift по stackTrace и тексту сообщения. Маппит ошибки на конкретные типы DatabaseFailure и StorageFailure.

Возвращает: Failure или null, если ошибка не связана с Drift.

Implementation

@override
Failure? tryMap(Object error, [StackTrace? stackTrace]) {
  final traceStr = stackTrace?.toString() ?? '';
  final errorStr = error.toString();

  // Проверяем по stackTrace — есть ли package:drift в frame
  final isDriftError =
      traceStr.contains('package:drift') ||
      errorStr.contains('DriftError') ||
      errorStr.contains('SqliteError') ||
      errorStr.contains('SQLiteException');

  if (!isDriftError) return null;

  if (_containsAny(errorStr, const [
    'unique constraint failed',
    'duplicate',
    'already exists',
  ])) {
    return const Failure.database(
      type: DatabaseFailure.uniqueConstraintViolation,
    );
  }

  if (_containsAny(errorStr, const [
    'foreign key constraint failed',
    'foreign key',
  ])) {
    return const Failure.database(type: DatabaseFailure.foreignKeyViolation);
  }

  if (_containsAny(errorStr, const [
    'not null constraint failed',
    'null value',
  ])) {
    return const Failure.database(type: DatabaseFailure.notNullViolation);
  }

  if (_containsAny(errorStr, const [
    'database is locked',
    'locked',
    'busy',
  ])) {
    return const Failure.database(type: DatabaseFailure.locked);
  }

  if (_containsAny(errorStr, const [
    'malformed',
    'corrupt',
    'corrupted',
    'database disk image is malformed',
  ])) {
    return const Failure.database(type: DatabaseFailure.corrupted);
  }

  if (_containsAny(errorStr, const ['no space left', 'disk full'])) {
    return const Failure.storage(type: StorageFailure.outOfSpace);
  }

  if (_containsAny(errorStr, const ['timeout', 'timed out'])) {
    return const Failure.database(type: DatabaseFailure.queryTimeout);
  }

  if (_containsAny(errorStr, const ['transaction', 'rollback', 'commit'])) {
    return const Failure.database(type: DatabaseFailure.transactionFailed);
  }

  if (_containsAny(errorStr, const [
    'no such table',
    'migration',
    'schema version',
    'missing column',
    'no such column',
  ])) {
    return const Failure.database(type: DatabaseFailure.migrationFailed);
  }

  if (_containsAny(errorStr, const ['select', 'query', 'read'])) {
    return const Failure.database(type: DatabaseFailure.readError);
  }

  if (_containsAny(errorStr, const ['insert', 'write', 'save', 'upsert'])) {
    return const Failure.database(type: DatabaseFailure.writeError);
  }

  if (_containsAny(errorStr, const ['update'])) {
    return const Failure.database(type: DatabaseFailure.updateError);
  }

  if (_containsAny(errorStr, const ['delete', 'remove'])) {
    return const Failure.database(type: DatabaseFailure.deleteError);
  }

  return const Failure.database(type: DatabaseFailure.writeError);
}