Rust capped exponential backoff retry helper

Rust
use std::thread::sleep;
use std::time::{Duration, SystemTime, UNIX_EPOCH};

fn with_retry<T, E, F>(mut op: F, attempts: u32) -> Result<T, E>
where
    F: FnMut(u32) -> Result<T, E>,
{
    let mut last: Option<E> = None;
    for attempt in 0..attempts {
        match op(attempt) {
            Ok(value) => return Ok(value),
            Err(err) => {
                last = Some(err);
                let base = 50u64 << attempt.min(6);
                let jitter = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().subsec_nanos() as u64 % 50;
                sleep(Duration::from_millis(base + jitter));
            }
        }
    }
    Err(last.expect("attempts must be greater than zero"))
}