1use core::fmt;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum StateRequirement {
8 Probed,
10}
11
12impl fmt::Display for StateRequirement {
13 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
14 match self {
15 Self::Probed => write!(f, "a successful probe"),
16 }
17 }
18}
19
20#[derive(Debug, Clone, PartialEq, Eq)]
26pub enum Error<E> {
27 Transport(E),
29 InvalidIdentity {
31 devid_ad: u8,
33 devid_mst: u8,
35 partid: u8,
37 },
38 InvalidResponseLength {
40 register: u8,
42 expected: usize,
44 actual: usize,
46 },
47 InvalidState {
49 required: StateRequirement,
51 },
52 InvalidConfiguration {
54 register: u8,
56 value: u8,
58 },
59 NotReady,
61 Timeout,
63 Unsupported,
65 Restore(E),
67}
68
69impl<E> Error<E> {
70 pub fn transport_cause(&self) -> Option<&E> {
72 match self {
73 Self::Transport(source) | Self::Restore(source) => Some(source),
74 _ => None,
75 }
76 }
77
78 pub const fn is_restore_failure(&self) -> bool {
80 matches!(self, Self::Restore(_))
81 }
82}
83
84impl<E: fmt::Display> fmt::Display for Error<E> {
85 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
86 match self {
87 Self::Transport(source) => write!(f, "transport error: {source}"),
88 Self::InvalidIdentity {
89 devid_ad,
90 devid_mst,
91 partid,
92 } => write!(
93 f,
94 "invalid ADXL355 identity (DEVID_AD=0x{devid_ad:02X}, DEVID_MST=0x{devid_mst:02X}, PARTID=0x{partid:02X})"
95 ),
96 Self::InvalidResponseLength {
97 register,
98 expected,
99 actual,
100 } => write!(
101 f,
102 "invalid response length at register 0x{register:02X}: expected {expected}, received {actual}"
103 ),
104 Self::InvalidState { required } => {
105 write!(f, "invalid device state; operation requires {required}")
106 }
107 Self::InvalidConfiguration { register, value } => write!(
108 f,
109 "invalid configuration value 0x{value:02X} in register 0x{register:02X}"
110 ),
111 Self::NotReady => write!(f, "data not ready"),
112 Self::Timeout => write!(f, "operation timed out"),
113 Self::Unsupported => write!(f, "unsupported operation"),
114 Self::Restore(source) => write!(f, "failed to restore device state: {source}"),
115 }
116 }
117}
118
119#[cfg(feature = "std")]
120impl<E> std::error::Error for Error<E>
121where
122 E: std::error::Error + 'static,
123{
124 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
125 match self {
126 Self::Transport(source) | Self::Restore(source) => Some(source),
127 _ => None,
128 }
129 }
130}