An open API service indexing awesome lists of open source software.

https://github.com/leshow/retry_fn

retry executing a closure or future on a timer
https://github.com/leshow/retry_fn

Last synced: about 1 year ago
JSON representation

retry executing a closure or future on a timer

Awesome Lists containing this project

README

          

# retry_fn

[![Build Status](https://github.com/leshow/retry_fn/workflows/Actions/badge.svg)](https://github.com/leshow/retry_fn/actions)
[![Crate](https://img.shields.io/crates/v/retry_fn.svg)](https://crates.io/crates/retry_fn)
[![API](https://docs.rs/retry_fn/badge.svg)](https://docs.rs/retry_fn)

Function for executing retry either as a closure with a std-based sleep (`thread::sleep`) or
using either of the most popular async runtime's. Tokio or async-std. Inspired by the other
retry libraries out there, the desire is to keep this up-to-date and combine features from several.

## Sync Example

```rust
use std::{io, time::Duration};
use retry_fn::{retry, strategy::ExponentialBackoff, RetryResult};

fn main() -> Result<(), Box> {
let mut count = 0;
let res = retry(ExponentialBackoff::new(Duration::from_secs(2)), |op| {
if op.retries >= 3 {
RetryResult::<&str, _>::Err(io::Error::new(
io::ErrorKind::TimedOut,
"timed out",
))
} else {
count += 1;
RetryResult::Retry()
}
});
assert_eq!(count, 3);
assert!(res.is_err());
Ok(())
}
```

## Using tokio

Enable the `tokio-runtime` feature to get access to this function

```rust
use std::{io, sync::{Arc, Mutex}};
use retry_fn::{tokio::retry, strategy::Constant, RetryResult};

#[tokio::main]
async fn main() -> Result<(), Box> {
let count: Arc> = Arc::new(Mutex::new(0));
let res = retry(Constant::from_millis(100), |op| {
let count = count.clone();
async move {
if op.retries >= 3 {
RetryResult::<&str, _>::Err(io::Error::new(
io::ErrorKind::TimedOut,
"timed out",
))
} else {
*count.lock().unwrap() += 1;
RetryResult::Retry()
}
}
})
.await;
assert_eq!(*count.lock().unwrap(), 3);
assert!(res.is_err());
Ok(())
}
```