bitbox_api/
error.rs

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