backoff 0.1.5

Retry operations with exponential backoff policy.
Documentation
extern crate backoff;

use backoff::ExponentialBackoff;
use backoff::Operation;
use backoff::Error;

use std::io;

#[test]
fn retry() {
    let mut i = 0;
    let success_on = 3;

    {
        let mut f = || -> Result<(), Error<io::Error>> {
            i += 1;
            if i == success_on {
                return Ok(());
            }

            Err(Error::Transient(io::Error::new(io::ErrorKind::Other, "err")))
        };

        let mut backoff = ExponentialBackoff::default();
        f.retry(&mut backoff).ok().unwrap();
    }

    assert_eq!(i, success_on);
}

#[test]
fn permanent_error_immediately_returned() {
    let mut f = || -> Result<(), Error<io::Error>> {
        Err(Error::Permanent(io::Error::new(io::ErrorKind::Other, "err")))
    };

    let mut backoff = ExponentialBackoff::default();
    match f.retry(&mut backoff).err().unwrap() {
        Error::Permanent(_) => (),
        other => panic!("{}", other),
    }
}