1#[derive(Debug, thiserror::Error)]
5#[non_exhaustive]
6pub enum BleError {
7 #[error("TLV8 error: {0}")]
9 Tlv8(#[from] hap_tlv8::Tlv8Error),
10 #[error("crypto error: {0}")]
12 Crypto(#[from] hap_crypto::CryptoError),
13 #[error("model error: {0}")]
15 Model(#[from] hap_model::ModelError),
16 #[error("accessory not found")]
18 AccessoryNotFound,
19 #[error("characteristic (aid={aid}, iid={iid}) not found")]
21 CharacteristicNotFound {
22 aid: u64,
24 iid: u64,
26 },
27 #[error("malformed HAP-BLE PDU: {0}")]
29 MalformedPdu(&'static str),
30 #[error("accessory rejected pairing (status {0})")]
32 PairingRejected(u8),
33 #[error("the accessory disconnected")]
35 Disconnected,
36 #[error("BLE backend error: {0}")]
38 Backend(String),
39}
40
41pub type Result<T> = core::result::Result<T, BleError>;
43
44#[cfg(test)]
45mod tests {
46 use super::*;
47
48 #[test]
49 fn tlv8_error_converts_via_from() {
50 fn inner() -> Result<()> {
52 let _ = hap_tlv8::Tlv8Map::parse(&[0x01])?; Ok(())
54 }
55 #[allow(clippy::unwrap_used)] let err = inner().unwrap_err();
57 assert!(matches!(err, BleError::Tlv8(_)));
58 }
59
60 #[test]
61 fn char_not_found_displays_ids() {
62 let e = BleError::CharacteristicNotFound { aid: 1, iid: 9 };
63 assert_eq!(e.to_string(), "characteristic (aid=1, iid=9) not found");
64 }
65}