use std::time::Duration;
use qubit_retry::RetryContext;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct CasContext {
attempt: u32,
max_attempts: u32,
max_operation_elapsed: Option<Duration>,
max_total_elapsed: Option<Duration>,
total_elapsed: Duration,
attempt_elapsed: Duration,
attempt_timeout: Option<Duration>,
next_delay: Option<Duration>,
}
impl CasContext {
#[inline]
pub(crate) fn new(context: &RetryContext, attempt_timeout: Option<Duration>) -> Self {
Self {
attempt: context.attempt(),
max_attempts: context.max_attempts(),
max_operation_elapsed: context.max_operation_elapsed(),
max_total_elapsed: context.max_total_elapsed(),
total_elapsed: context.total_elapsed(),
attempt_elapsed: context.attempt_elapsed(),
attempt_timeout: attempt_timeout.or(context.attempt_timeout()),
next_delay: context.next_delay(),
}
}
#[inline]
pub fn attempt(&self) -> u32 {
self.attempt
}
#[inline]
pub fn max_attempts(&self) -> u32 {
self.max_attempts
}
#[inline]
pub fn max_retries(&self) -> u32 {
self.max_attempts.saturating_sub(1)
}
#[inline]
pub fn max_operation_elapsed(&self) -> Option<Duration> {
self.max_operation_elapsed
}
#[inline]
pub fn max_total_elapsed(&self) -> Option<Duration> {
self.max_total_elapsed
}
#[inline]
pub fn total_elapsed(&self) -> Duration {
self.total_elapsed
}
#[inline]
pub fn attempt_elapsed(&self) -> Duration {
self.attempt_elapsed
}
#[inline]
pub fn attempt_timeout(&self) -> Option<Duration> {
self.attempt_timeout
}
#[inline]
pub fn next_delay(&self) -> Option<Duration> {
self.next_delay
}
}