use serde::{Deserialize, Serialize};
#[derive(Debug, Copy, Clone, PartialEq, Eq, thiserror::Error, Serialize, Deserialize)]
pub enum ParseError {
#[error(
"unexpected end of buffer at byte offset {offset} (needed {needed}, available {available})"
)]
UnexpectedEof {
offset: usize,
needed: usize,
available: usize,
},
#[error(
"padded read exceeds capacity at byte offset {offset} (requested {requested}, capacity {ret_len})"
)]
InvalidPaddingLength {
offset: usize,
requested: usize,
ret_len: usize,
},
}
impl ParseError {
#[cold]
#[inline(never)]
pub fn eof(offset: usize, needed: usize, available: usize) -> Self {
Self::UnexpectedEof {
offset,
needed,
available,
}
}
#[cold]
#[inline(never)]
pub fn invalid_padding_length(offset: usize, requested: usize, ret_len: usize) -> Self {
Self::InvalidPaddingLength {
offset,
requested,
ret_len,
}
}
#[inline]
pub fn offset(&self) -> usize {
match self {
Self::UnexpectedEof { offset, .. } | Self::InvalidPaddingLength { offset, .. } => {
*offset
}
}
}
#[inline]
pub fn is_incomplete(&self) -> bool {
matches!(self, Self::UnexpectedEof { .. })
}
}