withRetry

Result<T, String> withRetry<T>(

  1. RetryPolicy policy,
  2. bool isRetryable(
    1. String error
    ),
  3. Result<T, String> operation(), {
  4. void onRetry(
    1. int attempt,
    2. String error,
    3. int delayMs
    )?,
})

Execute operation with retry on transient errors.

policy - Retry configuration isRetryable - Function to determine if an error is retryable operation - The operation to execute onRetry - Optional callback when a retry occurs (for logging)

Implementation

Result<T, String> withRetry<T>(
  RetryPolicy policy,
  bool Function(String error) isRetryable,
  Result<T, String> Function() operation, {
  void Function(int attempt, String error, int delayMs)? onRetry,
}) {
  var lastError = '';
  var delayMs = policy.baseDelayMs;

for (var attempt = 1; attempt <= policy.maxAttempts; attempt++) { final result = operation(); if (result case Success()) return result; if (result case Error(:final error)) { lastError = error; if (!isRetryable(error) || attempt == policy.maxAttempts) { return result; } onRetry?.call(attempt, error, delayMs); _sleepSync(delayMs); delayMs = (delayMs * policy.backoffMultiplier).round(); } } return Error(lastError); }