mapDioException function

Failure mapDioException(
  1. DioException e, [
  2. StackTrace? stackTrace
])

Maps a DioException to the appropriate Failure variant.

Exposed at top level so other integrations (e.g. Retrofit, which throws DioException from generated clients) can reuse it.

Implementation

Failure mapDioException(DioException e, [StackTrace? stackTrace]) {
  final st = stackTrace ?? e.stackTrace;
  final status = e.response?.statusCode;
  final retryAfterHeader = e.response?.headers.value('retry-after') ??
      e.response?.headers.value('Retry-After');
  final retryAfter = Failure.parseRetryAfter(retryAfterHeader);

  return switch (e.type) {
    DioExceptionType.connectionTimeout ||
    DioExceptionType.sendTimeout ||
    DioExceptionType.receiveTimeout =>
      Failure.timeout(
        cause: e,
        stackTrace: st,
      ),
    DioExceptionType.cancel => Failure.cancelled(cause: e, stackTrace: st),
    DioExceptionType.connectionError => Failure.network(
        message: e.message ?? 'Connection error',
        cause: e,
        stackTrace: st,
      ),
    DioExceptionType.badCertificate => Failure.network(
        message: 'Bad certificate',
        cause: e,
        stackTrace: st,
      ),
    DioExceptionType.badResponse => switch (status) {
        401 => Failure.unauthorized(cause: e, stackTrace: st),
        404 => Failure.notFound(cause: e, stackTrace: st),
        429 => Failure.rateLimit(
            cause: e,
            stackTrace: st,
            retryAfter: retryAfter,
          ),
        final s when s != null && s >= 500 && s < 600 => Failure.serverError(
            code: s,
            cause: e,
            stackTrace: st,
            retryAfter: retryAfter,
          ),
        _ => Failure.badResponse(
            code: status,
            message: e.message ?? 'Bad response',
            cause: e,
            stackTrace: st,
          ),
      },
    DioExceptionType.unknown => Failure.unknown(
        message: e.message ?? 'Unknown error',
        cause: e,
        stackTrace: st,
      ),
  };
}