use std;
use std::fmt::{self, Display};
use serde::{de, ser};
use crate::dds::values::result::Error as DDSError;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
pub enum Error {
Message(String),
IOError(std::io::Error),
SequenceLengthUnknown,
Eof,
BadBoolean(u8),
BadString(std::str::Utf8Error), BadChar(u32), BadOption(u32), TrailingCharacters(Vec<u8>),
}
impl ser::Error for Error {
fn custom<T: Display>(msg: T) -> Self {
Error::Message(msg.to_string())
}
}
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::Eof => formatter.write_str("unexpected end of input"),
Error::IOError(e) => formatter.write_fmt(format_args!("io::Error: {:?}", e)),
Error::SequenceLengthUnknown => formatter
.write_str("CDR serialization requires sequence length to be specified at the start."),
Error::BadChar(e) => formatter.write_fmt(format_args!("Bad Unicode character code: {:?}", e)),
Error::BadBoolean(e) => {
formatter.write_fmt(format_args!("Expected 0 or 1 as Boolean, got: {:?}", e))
}
Error::TrailingCharacters(vec) => {
formatter.write_fmt(format_args!("Trailing garbage, {:?} bytes", vec.len()))
}
Error::BadString(utf_err) => formatter.write_fmt(format_args!("UTF-8 error: {:?}", utf_err)),
Error::BadOption(tag) => formatter.write_fmt(format_args!(
"Option value must have discriminant 0 or 1, read: {:?}",
tag
)),
}
}
}
impl From<std::io::Error> for Error {
fn from(ioerr: std::io::Error) -> Error {
Error::IOError(ioerr)
}
}
impl From<Error> for DDSError {
fn from(ser_error: Error) -> DDSError {
DDSError::Serialization{ reason: format!("{:?}",ser_error) }
}
}
impl std::error::Error for Error {}