use thiserror::Error;
#[derive(Debug, Error)]
pub enum TransferLimitError<E, C = usize> {
#[error("transfer size limit exceeded: observed {actual} bytes with a {limit} byte limit")]
LimitExceeded {
limit: C,
actual: C,
},
#[error(
"transfer counter overflowed after {bytes_seen} bytes while adding a {chunk_len} byte chunk"
)]
CounterOverflow {
bytes_seen: C,
chunk_len: usize,
},
#[error("inner stream returned an error")]
Inner {
#[source]
source: E,
},
}
impl<E, C> TransferLimitError<E, C> {
pub fn is_limit_exceeded(&self) -> bool {
matches!(self, Self::LimitExceeded { .. })
}
pub fn is_counter_overflow(&self) -> bool {
matches!(self, Self::CounterOverflow { .. })
}
pub fn into_inner(self) -> Option<E> {
match self {
Self::Inner { source } => Some(source),
Self::LimitExceeded { .. } | Self::CounterOverflow { .. } => None,
}
}
pub(crate) fn inner(source: E) -> Self {
Self::Inner { source }
}
}
impl<E, C> From<E> for TransferLimitError<E, C> {
fn from(source: E) -> Self {
Self::inner(source)
}
}