use crate::errors::{Error, Result};
use aerospike_rt::sleep;
use aerospike_rt::time::{Duration, Instant};
#[derive(Debug, Clone, Copy)]
pub enum Status {
NotFound,
InProgress,
Complete,
}
static POLL_INTERVAL: Duration = Duration::from_secs(1);
#[async_trait::async_trait]
pub trait Task {
async fn query_status(&self) -> Result<Status>;
async fn wait_till_complete(&self, timeout: Option<Duration>) -> Result<Status> {
let now = Instant::now();
let timeout_elapsed = |deadline| now.elapsed() + POLL_INTERVAL > deadline;
loop {
sleep(POLL_INTERVAL).await;
match self.query_status().await {
Ok(Status::NotFound) => {
return Err(Error::BadResponse("task status not found".to_string()))
}
Ok(Status::InProgress) => {} error_or_complete => return error_or_complete,
}
if timeout.is_some_and(timeout_elapsed) {
return Err(Error::Timeout("Task timeout reached".to_string()));
}
}
}
}