ledger_lib/
error.rs

1//! Ledger interface [Error] type and conversions
2
3use ledger_proto::{ApduError, StatusCode};
4
5/// Ledger interface error type
6#[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    /// Recognised status codes (see [StatusCode])
48    #[error("Status: {0}")]
49    Status(StatusCode),
50
51    /// Unrecognised status codes
52    #[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}