use {
failure::{Compat, Fail},
serde::ser,
std::{
error,
fmt::{self, Display, Formatter},
io, result,
},
};
#[derive(Debug, Fail)]
pub enum SerializationError {
#[fail(display = "custom error message: {}", message)]
Custom {
message: String,
},
#[fail(display = "failed to serialize {}", what)]
Failure {
what: String,
#[cause]
cause: Box<CompatSerializationError>,
},
#[fail(display = "IO error while serializing {}: {}", what, cause)]
IoError {
what: String,
#[cause]
cause: io::Error,
},
#[fail(display = "XDR does not support a map type")]
MapIsNotSupported,
#[fail(display = "opaque data is too long: {} bytes", length)]
OpaqueDataIsTooLong {
length: usize,
},
#[fail(display = "fatal failure while serializing {}", type_name)]
SequenceOrTupleFatalError {
type_name: String,
},
#[fail(display = "fatal failure while serializing struct: {}", name)]
StructFatalError {
name: String,
},
#[fail(display = "sequence is too long to be serialized: {}", length)]
SequenceTooLong {
length: usize,
},
#[fail(display = "can't serialize sequence with unknown length")]
SequenceWithUnknownLength,
#[fail(display = "string is not ASCII encoded: {}", string)]
StringIsNotAscii {
string: String,
},
#[fail(display = "string is too long: {}", string)]
StringIsTooLong {
string: String,
},
}
#[derive(Debug)]
pub struct CompatSerializationError(Compat<SerializationError>);
impl From<SerializationError> for CompatSerializationError {
fn from(error: SerializationError) -> Self {
CompatSerializationError(error.compat())
}
}
impl Display for CompatSerializationError {
fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
self.0.fmt(formatter)
}
}
impl error::Error for CompatSerializationError {
fn description(&self) -> &str {
self.0.description()
}
}
impl ser::Error for CompatSerializationError {
fn custom<T: Display>(message: T) -> Self {
let error = SerializationError::Custom {
message: message.to_string(),
};
CompatSerializationError(error.compat())
}
}
impl From<CompatSerializationError> for SerializationError {
fn from(wrapped_error: CompatSerializationError) -> Self {
match wrapped_error {
CompatSerializationError(error) => error.into_inner(),
}
}
}
pub type Result<T> = result::Result<T, CompatSerializationError>;