use std::future::Future;
use color_eyre::eyre::{eyre, Report, Result};
pub async fn retry_until_ok<F, Fut, Params: Clone, R>(
tries: u32,
label: &str,
params: Params,
f: F,
) -> Result<R, Report>
where
F: Fn(Params) -> Fut,
Fut: Future<Output = Result<R, Report>>,
{
let tries_string = if tries == 0 {
"unlimited".to_string()
} else {
format!("{tries}")
};
let mut try_number = 1;
let mut last_error = eyre!("retry_until_ok() - hit a bug!");
println!(">>TRYING {label} {tries_string} times: ");
while tries == 0 || try_number <= tries {
match f(params.clone()).await {
Ok(result) => {
println!(">>SUCCESS!");
return Ok(result);
}
Err(e) => last_error = eyre!(format!(">>{tries_string} complete with error - {e}")),
}
try_number = try_number + 1;
}
Err(last_error)
}