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("Unknown ledger model: {0}")]
21 UnknownModel(u16),
22
23 #[error("Unknown error")]
24 Unknown,
25
26 #[error("No devices found")]
27 NoDevices,
28
29 #[error("Invalid device index: {0}")]
30 InvalidDeviceIndex(usize),
31
32 #[error("Apdu encode/decode error: {0}")]
33 Apdu(#[from] ApduError),
34
35 #[error("Status: {0}")]
37 Status(StatusCode),
38
39 #[error("Status: 0x{0:02x}{1:02x} (unrecognised)")]
41 UnknownStatus(u8, u8),
42
43 #[error("Request timeout")]
44 Timeout,
45
46 #[error("Device or transport closed")]
47 Closed,
48
49 #[error("Empty response payload")]
50 EmptyResponse,
51
52 #[error("Unexpected response payload")]
53 UnexpectedResponse,
54
55 #[error("Device in use")]
56 DeviceInUse,
57
58 #[error("Already running application ({0})")]
59 ApplicationLoaded(String),
60}
61
62impl From<tokio::time::error::Elapsed> for Error {
63 fn from(_e: tokio::time::error::Elapsed) -> Self {
64 Self::Timeout
65 }
66}