use std::{io, str::Utf8Error};
#[derive(Debug)]
#[non_exhaustive]
pub enum Error {
Io(io::Error),
InvalidBoolValue(u8),
InvalidIntegerEncoding,
IntegerOverflow,
InvalidPath,
InvalidCharEncoding,
Utf8Error(Utf8Error),
Serialize(String),
Deserialize(String),
Conversion(String),
InvalidOptimisedTag(u8),
OptimisedOffsetOutOfRange {
offset: u32,
payload_len: u32,
},
OptimisedOffsetsNonMonotonic,
OptimisedKeyRegionNotAscending,
OptimisedSubReaderOverrun,
BorrowedReaderContractViolation(String),
}
impl std::error::Error for Error {
#[inline]
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Error::Io(x) => Some(x),
Error::Utf8Error(x) => Some(x),
_ => None,
}
}
}
impl std::fmt::Display for Error {
#[inline]
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::result::Result<(), std::fmt::Error> {
match self {
Self::Io(e) => write!(f, "An IO error occured: {}", e),
Self::InvalidBoolValue(_) => {
write!(f, "Tried to deserialize a boolean value with an invalid byte value.")
}
Self::InvalidIntegerEncoding => {
write!(f, "Encountered invalid integer encoding.")
}
Self::IntegerOverflow => {
write!(
f,
"Encountered integer which doesn't fit the target integer type during deserialization."
)
}
Self::InvalidPath => {
write!(f, "Path contained invalid UTF-8 characters.")
}
Self::InvalidCharEncoding => {
write!(f, "Invalid character encoding.")
}
Self::Utf8Error(x) => {
write!(f, "Invalid UTF-8 characters in string: {x}")
}
Self::Serialize(e) => write!(f, "A serialization error occured: {}", e),
Self::Deserialize(e) => write!(f, "A deserialization error occured: {}", e),
Self::Conversion(e) => write!(f, "A user generated conversion error occured: {}", e),
Self::InvalidOptimisedTag(t) => {
write!(f, "Invalid optimised wire-format tag byte: 0x{t:02x} (reserved size class)")
}
Self::OptimisedOffsetOutOfRange {
offset,
payload_len,
} => {
write!(
f,
"Optimised offset {offset} out of range for payload of {payload_len} bytes"
)
}
Self::OptimisedOffsetsNonMonotonic => {
write!(f, "Optimised indexed prologue offsets are not strictly monotonic")
}
Self::OptimisedKeyRegionNotAscending => {
write!(f, "Optimised indexed map keys are not strictly ascending")
}
Self::OptimisedSubReaderOverrun => {
write!(f, "Optimised varlen sub-reader length exceeds parent bytes")
}
Self::BorrowedReaderContractViolation(msg) => {
write!(f, "BorrowedReader implementation violates the trait safety contract: {msg}")
}
}
}
}