use crate::{
AttemptFailure,
AttemptFailureDecision,
AttemptTimeoutPolicy,
RetryOptions,
};
pub(in crate::executor) struct RetryFailurePolicy<'a> {
options: &'a RetryOptions,
}
impl<'a> RetryFailurePolicy<'a> {
#[inline]
pub(in crate::executor) fn new(options: &'a RetryOptions) -> Self {
Self { options }
}
pub(in crate::executor) fn resolve<E>(
&self,
decision: AttemptFailureDecision,
failure: &AttemptFailure<E>,
) -> AttemptFailureDecision {
if decision != AttemptFailureDecision::UseDefault {
return decision;
}
if matches!(failure, AttemptFailure::Timeout)
&& let Some(attempt_timeout) = self.options.attempt_timeout()
{
match attempt_timeout.policy() {
AttemptTimeoutPolicy::Retry => AttemptFailureDecision::Retry,
AttemptTimeoutPolicy::Abort => AttemptFailureDecision::Abort,
}
} else if matches!(failure, AttemptFailure::Panic(_) | AttemptFailure::Executor(_)) {
AttemptFailureDecision::Abort
} else {
AttemptFailureDecision::UseDefault
}
}
}