#[cfg(feature = "tokio")]
use std::future::Future;
#[cfg(feature = "tokio")]
use super::async_attempt::AsyncAttempt;
#[cfg(feature = "tokio")]
use super::async_attempt_future::AsyncAttemptFuture;
use crate::error::AttemptFailure;
#[cfg(feature = "tokio")]
pub(in crate::executor) struct AsyncValueOperation<T, F> {
operation: F,
value: Option<T>,
}
#[cfg(feature = "tokio")]
impl<T, F> AsyncValueOperation<T, F> {
pub(in crate::executor) fn new(operation: F) -> Self {
Self {
operation,
value: None,
}
}
pub(in crate::executor) fn into_value(self) -> T {
self.value
.expect("retry loop succeeded without an operation value")
}
}
#[cfg(feature = "tokio")]
impl<T, E, F, Fut> AsyncAttempt<E> for AsyncValueOperation<T, F>
where
F: FnMut() -> Fut,
Fut: Future<Output = Result<T, E>>,
{
fn call(&mut self) -> AsyncAttemptFuture<'_, E> {
Box::pin(async move {
match (self.operation)().await {
Ok(value) => {
self.value = Some(value);
Ok(())
}
Err(error) => Err(AttemptFailure::Error(error)),
}
})
}
}