convert method

Failure convert({
  1. required Object error,
  2. StackTrace? stackTrace,
  3. List<ExceptionConverter<Exception, void>>? exceptionConverters,
  4. MessageLog? messageLog,
})

Converts the given error into a Failure.

The error is expected to be an Exception object.

If the given error is an Error, then it is re-thrown. For more info, see https://stackoverflow.com/a/57004304.

If the given error is not an Exception, then an ArgumentError is thrown.

A messageLog can be provided to log the result if the target ExceptionConverter supports it.

Implementation

Failure convert({
  required Object error,
  StackTrace? stackTrace,
  List<ExceptionConverter<Exception, void>>? exceptionConverters,
  MessageLog? messageLog,
}) {
  if (error is Error) {
    // Errors must not be caught.
    // See https://stackoverflow.com/a/57004304
    if (stackTrace != null) {
      return Error.throwWithStackTrace(error, stackTrace);
    } else {
      throw error;
    }
  }

  if (error is! Exception) {
    throw ArgumentError(
      'The given error is not an Exception: ${error.runtimeType}',
    );
  }

  final extendedExceptionConverters =
      _extendedExceptionConverters<void>(exceptionConverters);

  for (final exceptionConverter in extendedExceptionConverters) {
    if (exceptionConverter.exceptionEquals(error)) {
      return exceptionConverter.convert(
        exception: error,
        messageLog: messageLog,
        logger: logger,
        stackTrace: stackTrace,
      );
    }
  }

  // coverage:ignore-start
  throw StateError(
    'No matching exception conversion found for ${error.runtimeType}',
  );
  // coverage:ignore-end
}