kx-utils 0.1.3

Common utils incubator
Documentation
//
#[macro_export]
macro_rules! backoff {
    ($backoff_secs:expr) => {{
        $backoff_secs *= 2;
        let jitter = rand::random::<u64>() % 10;
        let backoff_secs = 60.min($backoff_secs + jitter);
        tracing::debug(?backoff_secs, "Too many requests, backing off for {}s");
        tokio::time::sleep(tokio::time::Duration::from_secs(backoff_secs)).await;
    }};
}

#[macro_export]
macro_rules! with_exponential_backoff {
    ($operation:expr) => {{
        let mut backoff_secs = 1;
        loop {
            match $operation {
                Err(kxio::net::Error::Reqwest(err))
                    if err.status() == Some(kxio::net::StatusCode::TOO_MANY_REQUESTS) =>
                {
                    $crate::backoff!(backoff_secs)
                }
                Err(kxio::net::Error::ResponseError { response })
                    if response.status() == kxio::net::StatusCode::TOO_MANY_REQUESTS =>
                {
                    $crate::backoff!(backoff_secs)
                }
                Ok(response) if response.status() == kxio::net::StatusCode::TOO_MANY_REQUESTS => {
                    $crate::backoff!(backoff_secs)
                }
                result => break result,
            }
        }
    }};
}