async_retry/
async_retry.rs1use core::future::Future;
11use core::task::{Context, Poll, Waker};
12use core::time::Duration;
13
14use reliakit_retry::{retry_async, Backoff, RetryError, RetryPolicy};
15
16fn block_on<F: Future>(future: F) -> F::Output {
19 let waker = Waker::noop();
20 let mut cx = Context::from_waker(waker);
21 let mut future = core::pin::pin!(future);
22 loop {
23 if let Poll::Ready(value) = future.as_mut().poll(&mut cx) {
24 return value;
25 }
26 }
27}
28
29fn main() {
30 let policy = RetryPolicy::new(4, Backoff::constant(Duration::from_millis(20)))
31 .expect("max_attempts is non-zero");
32
33 let mut attempt = 0;
34 let result: Result<u32, RetryError<&str>> = block_on(retry_async(
35 &policy,
36 || {
37 attempt += 1;
38 let outcome = if attempt < 3 {
39 Err("temporary")
40 } else {
41 Ok(200)
42 };
43 async move { outcome }
44 },
45 |_error| true,
46 |delay| async move {
47 let _ = delay;
50 },
51 ));
52
53 println!("async result after {attempt} attempt(s): {result:?}");
54}