use crate::frame::Frame;
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug)]
pub enum ParseError {
Id {
frame: Frame,
},
Len {
frame: Frame,
expected: usize,
},
Data {
frame: Frame,
detail: String,
},
}
impl Into<Frame> for ParseError {
fn into(self) -> Frame {
match self {
ParseError::Id { frame }
| ParseError::Len { frame, .. }
| ParseError::Data { frame, .. } => frame,
}
}
}
impl std::fmt::Display for ParseError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ParseError::Id { frame } => write!(
f,
"Frame id `{:#X}` not recognized (data: `{:#X?}`).",
frame.id(),
frame.data(),
),
ParseError::Len { frame, expected } => write!(
f,
"Frame's length ({}); unexpected from source `{:#X}` (expected: {}).",
frame.data().len(),
frame.id(),
expected,
),
ParseError::Data { frame, detail } => write!(
f,
"Frame from source id `{:#X}` with data `{:#X?}` failed validation because: {}",
frame.id(),
frame.data(),
detail,
),
}
}
}
impl std::error::Error for ParseError
where
ParseError: std::fmt::Display + core::fmt::Debug,
{
#[inline]
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
None
}
#[inline]
fn cause(&self) -> Option<&dyn std::error::Error> {
self.source()
}
}