parseHttpError<T> function

Future<HttpError<T>> parseHttpError<T>({
  1. required DioException error,
  2. StackTrace stackTrace = StackTrace.empty,
  3. String slug = '',
  4. String handleErrorMessage({
    1. required DioException error,
    })?,
  5. T? errorResponseSerializer(
    1. dynamic
    )?,
  6. String defaultErrorMessage = "Algo inesperado aconteceu. Tente novamente mais tarde.",
  7. String defaultNoInternetConnectionMessage = '',
})

Implementation

Future<HttpError<T>> parseHttpError<T>({
  required DioException error,
  StackTrace stackTrace = StackTrace.empty,
  String slug = '',
  String Function({required DioException error})? handleErrorMessage,
  T? Function(dynamic)? errorResponseSerializer,
  String defaultErrorMessage =
      "Algo inesperado aconteceu. Tente novamente mais tarde.",
  String defaultNoInternetConnectionMessage = '',
}) async {
  Maybe<T> maybeErrorResponse = Maybe.from(errorResponseSerializer != null
      ? errorResponseSerializer(error.response?.data)
      : null);

  try {
    String msg = defaultErrorMessage;
    defaultNoInternetConnectionMessage =
        defaultNoInternetConnectionMessage.isNotEmpty
            ? defaultNoInternetConnectionMessage
            : defaultErrorMessage;

    slug = slug.isNotEmpty ? slug : error.message ?? error.requestOptions.path;

    String formattedStackTrace =
        (stackTrace.toString().isNotEmpty ? stackTrace : error.stackTrace)
            .toString();

    if (handleErrorMessage != null) {
      msg = handleErrorMessage(error: error);
    } else {
      if (error.response != null &&
          error.response?.headers.value('Content-Type') == 'application/json' &&
          (error.response?.data is Map) &&
          error.response?.data.containsKey('msg')) {
        msg = error.response?.data["msg"];
      }
    }

    if (error.type == DioExceptionType.badResponse) {
      switch (error.response?.statusCode) {
        case 400:
          return HttpBadRequestError(
            stackTrace: formattedStackTrace,
            slug: slug,
            msg: msg,
            errors: error.response?.data,
            response: maybeErrorResponse,
          );
        case 401:
          return HttpUnauthorizedError(
            stackTrace: formattedStackTrace,
            slug: slug,
            msg: msg,
            response: maybeErrorResponse,
          );
        case 403:
          return HttpForbiddenError(
            stackTrace: formattedStackTrace,
            slug: slug,
            msg: msg,
            response: maybeErrorResponse,
          );
        case 404:
          return HttpNotFoundError(
            stackTrace: formattedStackTrace,
            slug: slug,
            msg: msg,
            response: maybeErrorResponse,
          );
        case 410:
          return HttpGoneError(
            stackTrace: formattedStackTrace,
            slug: slug,
            msg: msg,
            response: maybeErrorResponse,
          );
        case 422:
          return UnprocessableEntityError(
            stackTrace: formattedStackTrace,
            slug: slug,
            msg: msg,
            errors: error.response?.data,
            response: maybeErrorResponse,
          );
        case 500:
          return HttpInternalServerError(
            stackTrace: formattedStackTrace,
            slug: slug,
            msg: msg,
            response: maybeErrorResponse,
          );
        default:
          return HttpUnknownError(
            stackTrace: formattedStackTrace,
            slug: slug,
            msg: msg,
            response: maybeErrorResponse,
          );
      }
    } else if (error.type == DioExceptionType.connectionTimeout ||
        error.type == DioExceptionType.receiveTimeout ||
        error.type == DioExceptionType.sendTimeout ||
        error.type == DioExceptionType.unknown ||
        error.type == DioExceptionType.connectionError) {
      return await parseSocketException(
        exception: error,
        slug: slug,
        msg: defaultNoInternetConnectionMessage,
        maybeErrorResponse: maybeErrorResponse,
      );
    } else {
      return HttpUnknownError(
        msg: defaultErrorMessage,
        response: maybeErrorResponse,
      );
    }
  } catch (e) {
    return HttpUnknownError(
      stackTrace: e.toString(),
      slug: slug,
      msg: defaultErrorMessage,
      response: maybeErrorResponse,
    );
  }
}