use core::time::Duration;
use std::thread::sleep;
use tracing::{info, trace};
use crate::error::Error;
pub fn assert_eventually_succeed<R>(
task_name: &str,
attempts: u16,
interval: Duration,
task: impl Fn() -> Result<R, Error>,
) -> Result<R, Error> {
sleep(interval);
for i in 0..attempts {
match task() {
Ok(res) => {
info!("task {} succeed after {} tries", task_name, i);
return Ok(res);
}
Err(e) => {
trace!("retrying task {} that failed with error: {}", task_name, e);
sleep(interval)
}
}
}
Err(Error::retry(task_name.to_string(), attempts))
}