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("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    /// Recognised status codes (see [StatusCode])
36    #[error("Status: {0}")]
37    Status(StatusCode),
38
39    /// Unrecognised status codes
40    #[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}