use super::{Display, Frame, Front, FrontOrRear, ParseError, Rear};
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(PartialEq, Debug, Clone)]
pub struct RoadFeedback([u8; 8]);
impl TryFrom<Frame> for FrontOrRear<RoadFeedback> {
type Error = ParseError;
fn try_from(frame: Frame) -> Result<Self, Self::Error> {
const LEN: usize = 8;
let data: [u8; LEN] = match frame.data().try_into() {
Ok(data) => data,
Err(_) => {
return Err(ParseError::Len {
frame,
expected: LEN,
})
}
};
match frame.id() {
0x24e => Ok(Front(RoadFeedback(data))),
0x252 => Ok(Rear(RoadFeedback(data))),
_ => Err(ParseError::Id { frame }),
}
}
}
impl std::fmt::Display for RoadFeedback {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_fmt(format_args!("RoadFeedback({:#x?})", self.0))
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(PartialEq, Debug, Display, Clone)]
#[repr(align(4))]
pub enum Force {
RoadFeedback(FrontOrRear<RoadFeedback>),
}
impl TryFrom<Frame> for Force {
type Error = ParseError;
fn try_from(frame: Frame) -> Result<Self, Self::Error> {
match frame.id() {
0x24e | 0x252 => Ok(Force::RoadFeedback(frame.try_into()?)),
_ => Err(ParseError::Id { frame }),
}
}
}