use std::fmt::{self, Display};
use bytes::TryGetError;
#[cfg(feature = "serde")]
use serde::{de, ser};
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Clone, Debug, PartialEq)]
pub enum Error {
Message(String),
InvalidType {
expected: String,
found: String,
},
InvalidValue {
expected: String,
found: String,
},
InvalidLength {
expected: String,
found: String,
},
InvalidVariant {
expected: String,
found: String,
},
UnknownField {
field: String,
expected: Vec<String>,
},
MissingField {
field: String,
},
DuplicateField {
field: String,
},
LimitExceeded {
limit: usize,
size: usize,
},
NoEnoughData {
expected: usize,
available: usize,
},
InvalidBoolValue(u8),
InvalidUtf8 {
value: Vec<u8>,
},
Overflow {
value: String,
max: String,
},
}
impl std::error::Error for Error {}
#[cfg(feature = "serde")]
impl ser::Error for Error {
fn custom<T: Display>(msg: T) -> Self {
Error::Message(msg.to_string())
}
}
#[cfg(feature = "serde")]
impl de::Error for Error {
fn custom<T: Display>(msg: T) -> Self {
Error::Message(msg.to_string())
}
}
impl Display for Error {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
match self {
Error::Message(msg) => formatter.write_str(msg),
Error::InvalidType { expected, found } => {
write!(
formatter,
"Invalid type: expected {expected}, found {found}"
)
}
Error::InvalidValue { expected, found } => {
write!(
formatter,
"Invalid value: expected {expected}, found {found}"
)
}
Error::InvalidLength { expected, found } => {
write!(
formatter,
"Invalid length: expected {expected}, found {found}"
)
}
Error::InvalidVariant { expected, found } => {
write!(
formatter,
"Invalid variant: expected {expected}, found {found}"
)
}
Error::UnknownField { field, expected } => {
write!(
formatter,
"Unknown field: {field}. Expected fields: {expected:?}"
)
}
Error::MissingField { field } => write!(formatter, "Missing field: {field}"),
Error::DuplicateField { field } => write!(formatter, "Duplicate field: {field}"),
Error::LimitExceeded { limit, size } => {
write!(formatter, "Limit exceeded: limit {limit}, size {size}")
}
Error::NoEnoughData {
expected,
available,
} => {
write!(
formatter,
"Not enough data: expected {expected}, available {available}"
)
}
Error::InvalidBoolValue(value) => write!(formatter, "Invalid boolean value: {value}"),
Error::InvalidUtf8 { value } => {
write!(formatter, "Invalid UTF-8 sequence: {value:?}")
}
Error::Overflow { value, max } => {
write!(formatter, "Overflow: value {value}, max {max}")
}
}
}
}
impl From<TryGetError> for Error {
fn from(value: TryGetError) -> Self {
Error::NoEnoughData {
expected: value.requested,
available: value.available,
}
}
}