use core::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum StateRequirement {
Probed,
}
impl fmt::Display for StateRequirement {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Probed => write!(f, "a successful probe"),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Error<E> {
Transport(E),
InvalidIdentity {
devid_ad: u8,
devid_mst: u8,
partid: u8,
},
InvalidResponseLength {
register: u8,
expected: usize,
actual: usize,
},
InvalidState {
required: StateRequirement,
},
InvalidConfiguration {
register: u8,
value: u8,
},
NotReady,
Timeout,
Unsupported,
Restore(E),
}
impl<E> Error<E> {
pub fn transport_cause(&self) -> Option<&E> {
match self {
Self::Transport(source) | Self::Restore(source) => Some(source),
_ => None,
}
}
pub const fn is_restore_failure(&self) -> bool {
matches!(self, Self::Restore(_))
}
}
impl<E: fmt::Display> fmt::Display for Error<E> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Transport(source) => write!(f, "transport error: {source}"),
Self::InvalidIdentity {
devid_ad,
devid_mst,
partid,
} => write!(
f,
"invalid ADXL355 identity (DEVID_AD=0x{devid_ad:02X}, DEVID_MST=0x{devid_mst:02X}, PARTID=0x{partid:02X})"
),
Self::InvalidResponseLength {
register,
expected,
actual,
} => write!(
f,
"invalid response length at register 0x{register:02X}: expected {expected}, received {actual}"
),
Self::InvalidState { required } => {
write!(f, "invalid device state; operation requires {required}")
}
Self::InvalidConfiguration { register, value } => write!(
f,
"invalid configuration value 0x{value:02X} in register 0x{register:02X}"
),
Self::NotReady => write!(f, "data not ready"),
Self::Timeout => write!(f, "operation timed out"),
Self::Unsupported => write!(f, "unsupported operation"),
Self::Restore(source) => write!(f, "failed to restore device state: {source}"),
}
}
}
#[cfg(feature = "std")]
impl<E> std::error::Error for Error<E>
where
E: std::error::Error + 'static,
{
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Self::Transport(source) | Self::Restore(source) => Some(source),
_ => None,
}
}
}