1use ledger_proto::{ApduError, StatusCode};
4
5#[derive(Debug, thiserror::Error)]
7pub enum Error {
8 #[cfg(feature = "transport_usb")]
9 #[error(transparent)]
10 Hid(#[from] hidapi::HidError),
11
12 #[cfg(feature = "transport_tcp")]
13 #[error(transparent)]
14 Tcp(#[from] tokio::io::Error),
15
16 #[cfg(feature = "transport_ble")]
17 #[error(transparent)]
18 Ble(#[from] btleplug::Error),
19
20 #[error("Attempted to send APDU to unknown device handle")]
21 ApduSentToUnknownDeviceHandle,
22
23 #[error("Request channel closed")]
24 RequestChannelClosed,
25
26 #[error("Request response channel closed")]
27 RequestResponseChannelClosed,
28
29 #[error("Unexpected response while listing devices")]
30 UnexpectedResponseWhileListingDevices,
31
32 #[error("Unexpected response while connecting")]
33 UnexpectedResponseWhileConnecting,
34
35 #[error("Unexpected response while exchanging data")]
36 UnexpectedResponseWhileExchangingData,
37
38 #[error("No devices found")]
39 NoDevices,
40
41 #[error("Invalid device index: {0}")]
42 InvalidDeviceIndex(usize),
43
44 #[error("Apdu encode/decode error: {0}")]
45 Apdu(#[from] ApduError),
46
47 #[error("Status: {0}")]
49 Status(StatusCode),
50
51 #[error("Status: 0x{0:02x}{1:02x} (unrecognised)")]
53 UnknownStatus(u8, u8),
54
55 #[error("Request timeout")]
56 Timeout,
57
58 #[error("Device or transport closed")]
59 Closed,
60
61 #[error("Empty response payload")]
62 EmptyResponse,
63
64 #[error("Unexpected response payload")]
65 UnexpectedResponse,
66
67 #[error("Device in use")]
68 DeviceInUse,
69
70 #[error("Cannot read BLE device properties")]
71 CannotReadBleDeviceProperties,
72
73 #[error("Cannot find BLE device specs")]
74 CannotFindBleDeviceSpecs,
75
76 #[error("The BLE device is still not connected after a successful connect")]
77 NotConnectedAfterSuccessfulBleConnect,
78
79 #[error("Missing read or write BLE characteristics")]
80 MissingReadOrWriteBleCharacteristics,
81
82 #[error("Unexpected MTU response")]
83 UnexpectedMtuResponse,
84}
85
86impl From<tokio::time::error::Elapsed> for Error {
87 fn from(_e: tokio::time::error::Elapsed) -> Self {
88 Self::Timeout
89 }
90}