use std::fmt;
use std::sync::PoisonError;
#[derive(Debug)]
pub enum BeaverError {
BuilderMissingField(&'static str),
QueueFull,
DamReleased,
LockPoisoned,
NoDam,
RangeIntervalRangesExceedTotal { total: u32, ranges_count: usize },
}
impl fmt::Display for BeaverError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
BeaverError::BuilderMissingField(field) => {
write!(f, "builder missing required field: {}", field)
}
BeaverError::QueueFull => write!(f, "task queue is full"),
BeaverError::DamReleased => write!(f, "execution thread has been released"),
BeaverError::LockPoisoned => write!(f, "internal lock poisoned"),
BeaverError::NoDam => write!(f, "no execution thread available"),
BeaverError::RangeIntervalRangesExceedTotal {
total,
ranges_count,
} => {
write!(
f,
"range interval ranges count ({}) exceeds total retry count ({})",
ranges_count, total
)
}
}
}
}
impl std::error::Error for BeaverError {}
impl<T> From<PoisonError<T>> for BeaverError {
fn from(_: PoisonError<T>) -> Self {
BeaverError::LockPoisoned
}
}
pub type BeaverResult<T> = Result<T, BeaverError>;
#[derive(Debug, Clone)]
pub enum RuntimeError {
LockPoisoned,
TaskExecutionFailed(String),
}
impl fmt::Display for RuntimeError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
RuntimeError::LockPoisoned => write!(f, "internal lock poisoned during execution"),
RuntimeError::TaskExecutionFailed(msg) => write!(f, "task execution failed: {}", msg),
}
}
}
impl std::error::Error for RuntimeError {}