use crate::messages::header::PayloadType;
use automotive_wire_codec::{Incomplete, TrailingBytes};
use thiserror::Error;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum MessageError {
#[error("Version Inverse Incorrect, Expected: {expected:X}, got: {value:X}")]
VersionInverseIncorrect {
expected: u8,
value: u8,
},
#[error(
"Payload length in header does not match expected payload type length: {value:?}, expected: {expected:?}"
)]
PayloadLengthTooShort {
value: usize,
expected: u32,
},
#[error("Payload of {size} bytes exceeds the u32 payload_length field")]
PayloadTooLarge {
size: usize,
},
#[error("Unexpected payload type found: {0:?}")]
UnexpectedPayloadType(PayloadType),
#[error("Unsupported payload type, cannot decode: {0:?}")]
UnsupportedPayloadType(PayloadType),
#[error(transparent)]
Incomplete(#[from] Incomplete),
#[error(transparent)]
TrailingBytes(#[from] TrailingBytes),
#[error("I/O error: {0:?}")]
Io(embedded_io::ErrorKind),
#[cfg(feature = "std")]
#[error("I/O error: {0}")]
Std(std::io::Error),
}
impl MessageError {
#[must_use]
pub fn is_framing_fatal(&self) -> bool {
matches!(
self,
MessageError::VersionInverseIncorrect { .. } | MessageError::Incomplete(_)
)
}
}
impl From<embedded_io::ErrorKind> for MessageError {
fn from(kind: embedded_io::ErrorKind) -> Self {
MessageError::Io(kind)
}
}
#[cfg(feature = "std")]
impl From<std::io::Error> for MessageError {
fn from(err: std::io::Error) -> Self {
MessageError::Std(err)
}
}