bitbox_api/
error.rs

1use thiserror::Error;
2
3#[cfg(feature = "wasm")]
4use enum_assoc::Assoc;
5
6use crate::communication;
7
8#[cfg_attr(feature = "wasm", derive(Assoc), func(pub const fn js_code(&self) -> &'static str))]
9#[derive(Error, Debug)]
10pub enum BitBoxError {
11    #[error("error code not recognized")]
12    #[cfg_attr(feature = "wasm", assoc(js_code = "unknown"))]
13    Unknown,
14    #[error("invalid input")]
15    #[cfg_attr(feature = "wasm", assoc(js_code = "invalid-input"))]
16    InvalidInput,
17    #[error("memory")]
18    #[cfg_attr(feature = "wasm", assoc(js_code = "memory"))]
19    Memory,
20    #[error("generic error")]
21    #[cfg_attr(feature = "wasm", assoc(js_code = "generic"))]
22    Generic,
23    #[error("aborted by the user")]
24    #[cfg_attr(feature = "wasm", assoc(js_code = "user-abort"))]
25    UserAbort,
26    #[error("can't call this endpoint: wrong state")]
27    #[cfg_attr(feature = "wasm", assoc(js_code = "invalid-state"))]
28    InvalidState,
29    #[error("function disabled")]
30    #[cfg_attr(feature = "wasm", assoc(js_code = "disabled"))]
31    Disabled,
32    #[error("duplicate entry")]
33    #[cfg_attr(feature = "wasm", assoc(js_code = "duplicate"))]
34    Duplicate,
35    #[error("noise encryption failed")]
36    #[cfg_attr(feature = "wasm", assoc(js_code = "noise-encrypt"))]
37    NoiseEncrypt,
38    #[error("noise decryption failed")]
39    #[cfg_attr(feature = "wasm", assoc(js_code = "noise-decrypt"))]
40    NoiseDecrypt,
41}
42
43#[cfg_attr(feature = "wasm", derive(Assoc), func(pub fn js_code(&self) -> String))]
44#[derive(Error, Debug)]
45pub enum Error {
46    #[error("unknown error")]
47    #[cfg_attr(feature = "wasm", assoc(js_code = "unknown".into()))]
48    Unknown,
49    #[error("firmware version {0} required")]
50    #[cfg_attr(feature = "wasm", assoc(js_code = "version".into()))]
51    Version(&'static str),
52    #[cfg(feature = "usb")]
53    #[error("hid error: {0}")]
54    Hid(#[from] hidapi::HidError),
55    #[cfg(feature = "simulator")]
56    #[error("simulator error: {0}")]
57    Simulator(#[from] crate::simulator::Error),
58    #[error("communication error: {0}")]
59    #[cfg_attr(feature = "wasm", assoc(js_code = "communication".into()))]
60    Communication(communication::Error),
61    #[error("noise channel error")]
62    #[cfg_attr(feature = "wasm", assoc(js_code = "noise".into()))]
63    Noise,
64    #[error("noise config error: {0}")]
65    #[cfg_attr(feature = "wasm", assoc(js_code = "noise-config".into()))]
66    NoiseConfig(#[from] crate::noise::ConfigError),
67    #[error("pairing code rejected by user")]
68    #[cfg_attr(feature = "wasm", assoc(js_code = "pairing-rejected".into()))]
69    NoisePairingRejected,
70    #[error("BitBox returned an unexpected response")]
71    #[cfg_attr(feature = "wasm", assoc(js_code = "unexpected-response".into()))]
72    UnexpectedResponse,
73    #[error("protobuf message could not be decoded")]
74    #[cfg_attr(feature = "wasm", assoc(js_code = "protobuf-decode".into()))]
75    ProtobufDecode,
76    #[error("bitbox error: {0}")]
77    #[cfg_attr(feature = "wasm", assoc(js_code = String::from("bitbox-") + _0.js_code().into()))]
78    BitBox(#[from] BitBoxError),
79    #[error("failed parsing keypath: {0}")]
80    #[cfg_attr(feature = "wasm", assoc(js_code = "keypath-parse".into()))]
81    KeypathParse(String),
82    #[error("PSBT error: {0}")]
83    #[cfg_attr(feature = "wasm", assoc(js_code = String::from("psbt-") + _0.js_code().into()))]
84    Psbt(#[from] crate::btc::PsbtError),
85    #[error("Unexpected signature format returned by BitBox")]
86    #[cfg_attr(feature = "wasm", assoc(js_code = "keypath-parse".into()))]
87    InvalidSignature,
88    #[error("Antiklepto verification failed: {0}")]
89    #[cfg_attr(feature = "wasm", assoc(js_code = "antiklepto".into()))]
90    AntiKlepto(#[from] crate::antiklepto::Error),
91    #[error("EIP-712 typed message processing error: {0}")]
92    #[cfg_attr(feature = "wasm", assoc(js_code = "eth-typed-message".into()))]
93    EthTypedMessage(String),
94    #[error("Bitcoin transaction signing error: {0}")]
95    #[cfg_attr(feature = "wasm", assoc(js_code = "btc-sign".into()))]
96    BtcSign(String),
97}
98
99impl From<communication::Error> for Error {
100    fn from(value: communication::Error) -> Self {
101        match value {
102            communication::Error::Version(s) => Error::Version(s),
103            e => Error::Communication(e),
104        }
105    }
106}