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,
}
}
}