pub enum WriteError<W = ()> {
Backpressure(W),
TimeoutError(W),
Shutdown,
ApplyError(u64, String),
FlushError(String),
Internal(String),
}
impl<W> WriteError<W> {
pub fn into_inner(self) -> Option<W> {
match self {
WriteError::Backpressure(w) | WriteError::TimeoutError(w) => Some(w),
_ => None,
}
}
pub fn discard_inner(self) -> WriteError {
match self {
WriteError::Backpressure(_) => WriteError::Backpressure(()),
WriteError::TimeoutError(_) => WriteError::TimeoutError(()),
WriteError::Shutdown => WriteError::Shutdown,
WriteError::ApplyError(epoch, msg) => WriteError::ApplyError(epoch, msg),
WriteError::FlushError(msg) => WriteError::FlushError(msg),
WriteError::Internal(msg) => WriteError::Internal(msg),
}
}
}
impl<W> std::fmt::Debug for WriteError<W> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
WriteError::Backpressure(_) => write!(f, "Backpressure(..)"),
WriteError::TimeoutError(_) => write!(f, "TimeoutError(..)"),
WriteError::Shutdown => write!(f, "Shutdown"),
WriteError::ApplyError(epoch, msg) => {
f.debug_tuple("ApplyError").field(epoch).field(msg).finish()
}
WriteError::FlushError(msg) => f.debug_tuple("FlushError").field(msg).finish(),
WriteError::Internal(msg) => f.debug_tuple("Internal").field(msg).finish(),
}
}
}
impl<W> std::fmt::Display for WriteError<W> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
WriteError::Backpressure(_) => write!(f, "write queue is full, backpressure applied"),
WriteError::TimeoutError(_) => {
write!(f, "timed out waiting for space in write queue")
}
WriteError::Shutdown => write!(f, "coordinator has been dropped/shutdown"),
WriteError::ApplyError(epoch, msg) => {
write!(f, "error applying write @{}: {}", epoch, msg)
}
WriteError::FlushError(msg) => write!(f, "error flushing delta: {}", msg),
WriteError::Internal(msg) => write!(f, "internal error: {}", msg),
}
}
}
impl<W> std::error::Error for WriteError<W> {}
pub type WriteResult<T> = Result<T, WriteError>;