use crate::types::Uint;
use core::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum SimpleRateLimitError {
InsufficientCapacity,
BeyondCapacity,
ExpiredTick,
ContentionFailure,
}
pub type SimpleRateLimitResult = Result<(), SimpleRateLimitError>;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum VerboseRateLimitError {
InsufficientCapacity {
acquiring: Uint,
available: Uint,
retry_after_ticks: Uint,
},
BeyondCapacity {
acquiring: Uint,
capacity: Uint,
},
ExpiredTick {
min_acceptable_tick: Uint,
},
ContentionFailure,
}
pub type VerboseRateLimitResult = Result<(), VerboseRateLimitError>;
impl fmt::Display for SimpleRateLimitError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
use SimpleRateLimitError::*;
match self {
InsufficientCapacity => write!(f, "Insufficient capacity (fast path)."),
BeyondCapacity => write!(f, "Request exceeds maximum capacity (fast path)."),
ExpiredTick => write!(f, "Expired tick (fast path)."),
ContentionFailure => write!(f, "Contention failure (fast path)."),
}
}
}
impl fmt::Display for VerboseRateLimitError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
use VerboseRateLimitError::*;
match self {
InsufficientCapacity { acquiring, available, retry_after_ticks } => {
write!(
f,
"Insufficient capacity: tried to acquire {}, available {}, retry after {} tick(s).",
acquiring, available, retry_after_ticks
)
}
BeyondCapacity { acquiring, capacity } => {
write!(
f,
"Request exceeds maximum capacity: tried to acquire {}, capacity {}. This request cannot succeed.",
acquiring, capacity
)
}
ExpiredTick { min_acceptable_tick } => {
write!(
f,
"Expired tick: minimum acceptable tick is {}.",
min_acceptable_tick
)
}
ContentionFailure => {
write!(f, "Contention failure: resource is locked by another operation. Please retry.")
}
}
}
}
impl std::error::Error for SimpleRateLimitError {}
impl std::error::Error for VerboseRateLimitError {}