use core::error::Error as StdError;
use core::fmt::{Display, Formatter, Result as FmtResult};
#[derive(Debug)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum MarshalerError {
InvalidCmdID {
expected: u16,
found: u16,
},
InvalidDataLength {
expected: usize,
found: usize,
},
BufferTooSmall {
need: usize,
},
Unexpected {
code: usize,
message: &'static str,
},
}
impl From<()> for MarshalerError {
fn from(_: ()) -> Self {
Self::Unexpected {
code: 0,
message: "Unit Type Error",
}
}
}
impl From<usize> for MarshalerError {
fn from(code: usize) -> Self {
Self::Unexpected {
code,
message: "Unexpected Error",
}
}
}
impl From<(usize,)> for MarshalerError {
fn from((code,): (usize,)) -> Self {
Self::Unexpected {
code,
message: "Unexpected Error",
}
}
}
impl From<(&'static str, usize)> for MarshalerError {
fn from((message, code): (&'static str, usize)) -> Self {
Self::Unexpected { code, message }
}
}
impl From<(usize, &'static str)> for MarshalerError {
fn from((code, message): (usize, &'static str)) -> Self {
Self::Unexpected { code, message }
}
}
#[derive(Debug)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum PackError {
BufferTooSmall {
need: usize,
},
InvalidPayloadSize {
expected: usize,
found: usize,
},
MarshalerError(MarshalerError),
}
impl From<MarshalerError> for PackError {
fn from(err: MarshalerError) -> Self {
Self::MarshalerError(err)
}
}
#[derive(Debug)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum UnPackError {
ReSync {
skip: usize,
},
MissingHeader {
skip: usize,
},
UnexpectedEnd {
read: usize,
},
InvalidChecksum {
at: usize,
},
MarshalerError(MarshalerError),
}
impl UnPackError {
pub fn skip(&self) -> usize {
match self {
Self::MissingHeader { skip } => *skip,
Self::ReSync { skip } => *skip,
Self::UnexpectedEnd { .. } => 0,
Self::InvalidChecksum { at } => *at,
Self::MarshalerError(_) => 0,
}
}
}
impl From<MarshalerError> for UnPackError {
fn from(err: MarshalerError) -> Self {
Self::MarshalerError(err)
}
}
impl StdError for MarshalerError {}
impl Display for MarshalerError {
fn fmt(&self, f: &mut Formatter) -> FmtResult {
match self {
Self::InvalidCmdID { expected, found } => write!(
f,
"Invalid Command ID: expected {}, found {}",
expected, found
),
Self::InvalidDataLength { expected, found } => {
write!(
f,
"Invalid Data Length: expected {} bytes, found {} bytes",
expected, found
)
}
Self::BufferTooSmall { need } => {
write!(f, "Buffer too Small: need {} bytes", need)
}
Self::Unexpected { code, message } => {
write!(
f,
"Unexpected Marshaler Error: code {}, message: {}",
code, message
)
}
}
}
}
impl Display for PackError {
fn fmt(&self, f: &mut Formatter) -> FmtResult {
match self {
Self::BufferTooSmall { need } => {
write!(f, "Buffer too Small: need {} bytes", need)
}
Self::InvalidPayloadSize { expected, found } => {
write!(
f,
"Invalid Payload Size: expected {}, found {}",
expected, found
)
}
Self::MarshalerError(e) => {
write!(f, "Marshaler Error: {}", e)
}
}
}
}
impl StdError for PackError {
fn source(&self) -> Option<&(dyn StdError + 'static)> {
match self {
Self::MarshalerError(e) => Some(e),
_ => None,
}
}
}
impl Display for UnPackError {
fn fmt(&self, f: &mut Formatter) -> FmtResult {
match self {
Self::ReSync { skip } => write!(f, "ReSync Needed: skip {} bytes", skip),
Self::MissingHeader { skip } => write!(f, "Missing Header: skip {} bytes", skip),
Self::UnexpectedEnd { read } => write!(f, "Unexpected End: read {} bytes", read),
Self::InvalidChecksum { at } => write!(f, "Invalid Checksum: at {} bytes", at),
Self::MarshalerError(e) => write!(f, "Marshaler Error: {}", e),
}
}
}
impl StdError for UnPackError {
fn source(&self) -> Option<&(dyn StdError + 'static)> {
match self {
Self::MarshalerError(e) => Some(e),
_ => None,
}
}
}