use std::error::Error;
use std::fmt;
pub type EncodingResult<T> = Result<T, EncodingError>;
#[derive(Debug, Clone, PartialEq)]
pub enum EncodingError {
BufferOverflow {
needed: usize,
available: usize,
},
InvalidFieldValue {
field: &'static str,
value: String,
},
MissingRequiredField {
field: &'static str,
},
ValueTooLarge {
field: &'static str,
max_value: u64,
actual_value: u64,
},
IoError(String),
}
impl fmt::Display for EncodingError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
EncodingError::BufferOverflow { needed, available } => {
write!(
f,
"Buffer overflow: needed {} bytes, had {}",
needed, available
)
}
EncodingError::InvalidFieldValue { field, value } => {
write!(f, "Invalid field value: {} = {}", field, value)
}
EncodingError::MissingRequiredField { field } => {
write!(f, "Missing required field: {}", field)
}
EncodingError::ValueTooLarge {
field,
max_value,
actual_value,
} => {
write!(
f,
"Value too large for field {}: {} > {} (max)",
field, actual_value, max_value
)
}
EncodingError::IoError(msg) => {
write!(f, "IO error: {}", msg)
}
}
}
}
impl Error for EncodingError {}
impl From<std::io::Error> for EncodingError {
fn from(err: std::io::Error) -> Self {
EncodingError::IoError(err.to_string())
}
}