run<T> static method

Future<ApiLoadResult<T>> run<T>(
  1. Future<T> operation(), {
  2. Duration timeout = const Duration(seconds: 10),
  3. int maxRetries = 0,
  4. Duration retryDelay = const Duration(seconds: 1),
})

Runs an operation with a timeout and up to maxRetries attempts.

Returns an ApiLoadResult indicating success or failure.

Example:

final result = await ApiLoader.run(
  () => fetchUserData(),
  timeout: Duration(seconds: 10),
  maxRetries: 2,
);

Implementation

static Future<ApiLoadResult<T>> run<T>(
  Future<T> Function() operation, {
  Duration timeout = const Duration(seconds: 10),
  int maxRetries = 0,
  Duration retryDelay = const Duration(seconds: 1),
}) async {
  int attempt = 0;
  while (attempt <= maxRetries) {
    try {
      final result = await operation().timeout(timeout);
      return ApiLoadResult.success(result);
    } on Exception catch (e) {
      final isTimeout = e.toString().contains('TimeoutException');
      if (isTimeout) {
        if (kDebugMode) {
          debugPrint('[SmartSplashKit] ApiLoader: timeout on attempt ${attempt + 1}');
        }
        if (attempt == maxRetries) return ApiLoadResult.timeout();
      } else {
        if (kDebugMode) {
          debugPrint('[SmartSplashKit] ApiLoader: error on attempt ${attempt + 1}: $e');
        }
        if (attempt == maxRetries) {
          return ApiLoadResult.failure(e.toString());
        }
      }
      attempt++;
      if (attempt <= maxRetries) {
        await Future.delayed(retryDelay);
      }
    } catch (e) {
      if (attempt == maxRetries) {
        return ApiLoadResult.failure(e.toString());
      }
      attempt++;
      await Future.delayed(retryDelay);
    }
  }
  return ApiLoadResult.failure('Unknown error');
}