use std::fmt;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct MultipartError {
kind: MultipartErrorKind,
offset: u64,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum MultipartErrorKind {
PreambleSizeLimit,
HeaderSizeLimit,
HeaderCountLimit,
PartCountLimit,
InvalidField,
FoldedField,
InvalidDelimiter,
UnexpectedEnd,
}
impl MultipartError {
pub(crate) fn new(kind: MultipartErrorKind, offset: u64) -> Self {
Self { kind, offset }
}
pub fn kind(&self) -> MultipartErrorKind {
self.kind
}
pub fn offset(&self) -> u64 {
self.offset
}
}
impl fmt::Display for MultipartError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
let description = match self.kind {
MultipartErrorKind::PreambleSizeLimit => "multipart preamble exceeds its size limit",
MultipartErrorKind::HeaderSizeLimit => {
"multipart part header section exceeds its size limit"
}
MultipartErrorKind::HeaderCountLimit => {
"multipart part header section exceeds its field count limit"
}
MultipartErrorKind::PartCountLimit => "multipart body exceeds its part count limit",
MultipartErrorKind::InvalidField => "invalid multipart part header field",
MultipartErrorKind::FoldedField => "folded multipart part header field",
MultipartErrorKind::InvalidDelimiter => "invalid multipart boundary line",
MultipartErrorKind::UnexpectedEnd => "multipart body ends before its closing boundary",
};
write!(formatter, "{description} at byte {}", self.offset)
}
}
impl std::error::Error for MultipartError {}