#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ParseErrorKind {
BlockSizeIsEmpty,
BlockSizeStartsWithZero,
BlockSizeIsInvalid,
BlockSizeIsTooLarge,
BlockHashIsTooLong,
UnexpectedCharacter,
UnexpectedEndOfString,
}
impl core::fmt::Display for ParseErrorKind {
#[rustfmt::skip]
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str(match self { ParseErrorKind::BlockHashIsTooLong => "block hash is too long",
ParseErrorKind::BlockSizeIsEmpty => "block size field is empty",
ParseErrorKind::BlockSizeStartsWithZero => "block size starts with '0'",
ParseErrorKind::BlockSizeIsInvalid => "block size is not valid",
ParseErrorKind::BlockSizeIsTooLarge => "block size is too large",
ParseErrorKind::UnexpectedCharacter => "an unexpected character is encountered",
ParseErrorKind::UnexpectedEndOfString => "end-of-string is not expected",
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ParseErrorOrigin {
BlockSize,
BlockHash1,
BlockHash2,
}
impl core::fmt::Display for ParseErrorOrigin {
#[rustfmt::skip]
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str(match self { ParseErrorOrigin::BlockSize => "block size",
ParseErrorOrigin::BlockHash1 => "block hash 1",
ParseErrorOrigin::BlockHash2 => "block hash 2",
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ParseError(
pub(crate) ParseErrorKind,
pub(crate) ParseErrorOrigin,
pub(crate) usize,
);
pub trait ParseErrorInfo {
fn kind(&self) -> ParseErrorKind;
fn origin(&self) -> ParseErrorOrigin;
fn offset(&self) -> usize;
}
impl ParseErrorInfo for ParseError {
fn kind(&self) -> ParseErrorKind {
self.0
}
fn origin(&self) -> ParseErrorOrigin {
self.1
}
fn offset(&self) -> usize {
self.2
}
}
impl core::fmt::Display for ParseError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(
f,
"error occurred while parsing a fuzzy hash ({1}, at byte offset {2}): {0}",
self.kind(),
self.origin(),
self.offset()
)
}
}
#[cfg(feature = "std")]
impl std::error::Error for ParseError {}
#[cfg(all(not(feature = "std"), feature = "unstable"))]
impl core::error::Error for ParseError {}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum BlockHashParseState {
MetEndOfString,
MetComma,
MetColon,
OverflowError,
Base64Error,
}
pub(crate) mod tests;