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))
}