tryMap method

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

Пытается преобразовать error в Failure, если это ошибка Isar.

Анализирует stackTrace и сообщение ошибки для определения категории:

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

Implementation

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

  // Проверяем по stackTrace — есть ли package:isar в frame
  final isIsarError =
      traceStr.contains('package:isar') ||
      errorStr.contains('IsarError') ||
      errorStr.contains('IsarImpl') ||
      errorStr.contains('IsarCollection');

  if (!isIsarError) return null;

  if (_containsAny(errorStr, const [
    'schema',
    'serialization',
    'deserialize',
    'type mismatch',
    'invalid type',
  ])) {
    return const Failure.parse(type: ParseFailure.schemaMismatch);
  }

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

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

  if (_containsAny(errorStr, const ['not found', 'object not found'])) {
    return const Failure.database(type: DatabaseFailure.notFound);
  }

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

  if (_containsAny(errorStr, const ['disk full', 'no space left'])) {
    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 ['read', 'query', 'find', 'get'])) {
    return const Failure.database(type: DatabaseFailure.readError);
  }

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

  if (_containsAny(errorStr, const ['update', 'modify'])) {
    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);
}