Use error chain iterators

When traversing error chains in Rust, prefer using the `chain()` iterator method over manual source traversal with while loops. The `chain()` method provides a more idiomatic and readable approach to walking through error chains, eliminating the need for manual loop management and making the code more concise.

copy reviewer prompt

Prompt

Reviewer Prompt

When traversing error chains in Rust, prefer using the chain() iterator method over manual source traversal with while loops. The chain() method provides a more idiomatic and readable approach to walking through error chains, eliminating the need for manual loop management and making the code more concise.

Instead of manually iterating through error sources:

let mut source = error.source();
while let Some(err) = source {
    if let Some(rl) = err.downcast_ref::<RateLimitedError>() {
        return rl.retry_after;
    }
    source = err.source();
}

Use the iterator-based approach:

error
    .chain()
    .find_map(|e| e.downcast_ref::<RateLimitedError>())
    .and_then(|rl| rl.retry_after)

This pattern works well with other iterator methods like any(), find(), and filter_map() to create more expressive and maintainable error handling code.

Source discussions