use std::time::Duration;
use crate::{
AttemptFailure,
AttemptTimeoutSource,
RetryErrorReason,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(in crate::executor) struct EffectiveAttemptTimeout {
pub(in crate::executor) duration: Option<Duration>,
pub(in crate::executor) source: Option<AttemptTimeoutSource>,
}
impl EffectiveAttemptTimeout {
#[inline]
pub(in crate::executor) fn new(
duration: Option<Duration>,
source: Option<AttemptTimeoutSource>,
) -> Self {
Self { duration, source }
}
#[inline]
pub(in crate::executor) fn elapsed_timeout_reason<E>(
&self,
failure: &AttemptFailure<E>,
) -> Option<RetryErrorReason> {
if !matches!(failure, AttemptFailure::Timeout) {
return None;
}
match self.source {
Some(AttemptTimeoutSource::MaxOperationElapsed) => {
Some(RetryErrorReason::MaxOperationElapsedExceeded)
}
Some(AttemptTimeoutSource::MaxTotalElapsed) => {
Some(RetryErrorReason::MaxTotalElapsedExceeded)
}
Some(AttemptTimeoutSource::Configured) | None => None,
}
}
}