use std::{fmt, io};
pub type Result<T> = ::core::result::Result<T, Error>;
#[derive(Debug)]
pub enum Error {
WriteSerialized(io::Error),
ReadSerialized(io::Error),
UnexpectedEof,
Unexpected {
expected: char,
actual: char,
},
ExpectedDigit {
actual: char,
},
NotUtf8String(std::str::Utf8Error),
CharConversionFailed(std::char::CharTryFromError),
NotAValidNumber(Box<dyn std::error::Error + Send + Sync>),
InvalidBooleanValue(char),
UnsupportedArrayKeyType(char),
InvalidTypeIndicator(char),
MissingFeature(&'static str),
IndexMismatch {
expected: usize,
actual: usize,
},
LengthRequired,
SerializationFailed(String),
DeserializationFailed(String),
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Error::WriteSerialized(ref err) | Error::ReadSerialized(ref err) => Some(err),
Error::NotUtf8String(ref err) => Some(err),
Error::CharConversionFailed(ref err) => Some(err),
Error::NotAValidNumber(ref err) => Some(err.as_ref()),
_ => None,
}
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
#[allow(clippy::enum_glob_use)]
use Error::*;
match self {
WriteSerialized(err) => write!(f, "Error writing serialized value: {}", err),
ReadSerialized(err) => write!(f, "Error reading serializing value: {}", err),
UnexpectedEof => write!(f, "Unexpected end of file while reading"),
Unexpected { expected, actual } => {
write!(f, "Expected `{}` but got `{}` instead", expected, actual)
}
ExpectedDigit { actual } => write!(f, "Expected a digit, but got `{}` instead", actual),
NotUtf8String(err) => write!(f, "Deserialized bytestring is not valid UTF: {}", err),
CharConversionFailed(err) => {
write!(f, "Could not convert into char from decimal value: {}", err)
}
NotAValidNumber(err) => {
write!(f, "Not a valid number or incorrect number type: {}", err)
}
InvalidBooleanValue(ch) => write!(f, "Not a valid value for boolean: {}", ch),
UnsupportedArrayKeyType(ch) => write!(f, "Unsupported array key type: {}", ch),
InvalidTypeIndicator(ch) => write!(f, "Invalid type indicator on value: {}", ch),
MissingFeature(feat) => write!(f, "Feature not implemented by `php_serde`: {}", feat),
IndexMismatch { expected, actual } => write!(
f,
"Array-index mismatch, expected {} but got {}",
expected, actual
),
LengthRequired => write!(f, "Attempted to serialize sequence of unknown length"),
SerializationFailed(err) => write!(f, "PHP Deserialization failed: {}", err),
DeserializationFailed(err) => write!(f, "PHP Serialization failed: {}", err),
}
}
}
impl serde::ser::Error for Error {
#[inline]
fn custom<T>(msg: T) -> Self
where
T: fmt::Display,
{
Error::SerializationFailed(msg.to_string())
}
}
impl serde::de::Error for Error {
#[inline]
fn custom<T>(msg: T) -> Self
where
T: fmt::Display,
{
Error::DeserializationFailed(msg.to_string())
}
}