use std::time::Duration;
use crate::{
AttemptFailure,
AttemptTimeoutSource,
RetryErrorReason,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct EffectiveAttemptTimeout {
duration: Option<Duration>,
source: Option<AttemptTimeoutSource>,
}
impl EffectiveAttemptTimeout {
#[inline]
pub(crate) fn new(duration: Option<Duration>, source: Option<AttemptTimeoutSource>) -> Self {
Self { duration, source }
}
#[inline]
pub(crate) fn none() -> Self {
Self::new(None, None)
}
#[inline]
pub(crate) fn duration(self) -> Option<Duration> {
self.duration
}
#[inline]
pub(crate) fn source(self) -> Option<AttemptTimeoutSource> {
self.source
}
#[inline]
pub(crate) 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,
}
}
}