use std::sync::atomic::{AtomicBool, Ordering};
use std::thread;
use std::time::{Duration, Instant};
use super::types::RetryWaitError;
use crate::constants::timeouts;
pub(crate) fn sleep_with_cancellation(
duration: Duration,
cancellation: Option<&AtomicBool>,
) -> std::result::Result<(), RetryWaitError> {
if cancellation.is_none() {
thread::sleep(duration);
return Ok(());
}
let deadline = Instant::now() + duration;
while Instant::now() < deadline {
if cancellation.is_some_and(|flag| flag.load(Ordering::SeqCst)) {
return Err(RetryWaitError::Cancelled);
}
let remaining = deadline.saturating_duration_since(Instant::now());
thread::sleep(remaining.min(timeouts::MANAGED_RETRY_POLL_INTERVAL));
}
Ok(())
}