tryhard 0.3.0

Easily retry futures
Documentation
# 💫 tryhard

[![Embark](https://img.shields.io/badge/embark-open%20source-blueviolet.svg)](https://embark.dev)
[![Embark](https://img.shields.io/badge/discord-ark-%237289da.svg?logo=discord)](https://discord.gg/dAuKfZS)
[![Crates.io](https://img.shields.io/crates/v/tryhard.svg)](https://crates.io/crates/tryhard)
[![Docs](https://docs.rs/tryhard/badge.svg)](https://docs.rs/tryhard)
[![dependency status](https://deps.rs/repo/github/EmbarkStudios/tryhard/status.svg)](https://deps.rs/repo/github/EmbarkStudios/tryhard)
[![Build status](https://github.com/EmbarkStudios/tryhard/workflows/CI/badge.svg)](https://github.com/EmbarkStudios/tryhard/actions)

`tryhard` makes it easy to retry futures that might fail. You can control the number of retries, the backoff strategy, and the max duration.

## Examples

First imagine you have some async function that can fail:

```rust
async fn read_file(path: &str) -> Result<String, std::io::Error> {
    // ...
}
```

Calling that function and retrying at most 10 times with no delay between attempts can be done like so:

```rust
tryhard::retry_fn(|| read_file("Cargo.toml"))
    .retries(10)
    .await?;
```

You can also retry with a fixed delay between attempts:

```rust
tryhard::retry_fn(|| read_file("Cargo.toml"))
    .retries(10)
    .fixed_backoff(Duration::from_millis(100))
    .await?;
```

Or exponential backoff, where the delay doubles each time, with a max delay of 1 second:

```rust
tryhard::retry_fn(|| read_file("Cargo.toml"))
    .retries(10)
    .exponential_backoff(Duration::from_millis(10))
    .max_delay(Duration::from_secs(1))
    .await?;
```

See [the docs](https://docs.rs/tryhard) for more details.

## Contributing

[![Contributor Covenant](https://img.shields.io/badge/contributor%20covenant-v2.0-ff69b4.svg)](../main/CODE_OF_CONDUCT.md)

We welcome community contributions to this project.

Please read our [Contributor Guide](CONTRIBUTING.md) for more information on how to get started.

## License

Licensed under either of

* Apache License, Version 2.0, ([LICENSE-APACHE]LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
* MIT license ([LICENSE-MIT]LICENSE-MIT or http://opensource.org/licenses/MIT)

at your option.

### Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.