Skip to main content

gm_lib/
error.rs

1use std::fmt::Display;
2
3use alloy::primitives::Address;
4use serde_json::Value;
5
6pub type Result<T> = std::result::Result<T, Error>;
7
8#[derive(Debug)]
9pub enum Error {
10    CurrentAccountNotSet,
11    AlchemyApiKeyNotSet,
12    DiskError(String),
13    NetworkNotFound(String),
14    AddressBook(&'static str),
15    SecretNotFound(Address),
16    InternalError(String),
17    InternalErrorStr(&'static str),
18    ParseIntError(Box<std::num::ParseIntError>),
19    ParseFloatError(Box<std::num::ParseFloatError>),
20    IoError(Box<std::io::Error>),
21    FromHexError(Box<alloy::hex::FromHexError>),
22    #[cfg(target_os = "macos")]
23    AppleSecurityFrameworkError(Box<security_framework::base::Error>),
24    InquireError(Box<inquire::InquireError>),
25    AlloyEcdsaError(Box<alloy::signers::k256::ecdsa::Error>),
26    TomlDeError(Box<toml::de::Error>),
27    TomlSerError(Box<toml::ser::Error>),
28    YamlError(Box<serde_yaml::Error>),
29    ReqwestError(Box<reqwest::Error>),
30    SerdeJson(Box<serde_json::Error>),
31    SerdePathToError(Box<serde_path_to_error::Error<serde_json::Error>>),
32    SerdeJsonWithValue(Box<serde_json::Error>, Box<Value>),
33    SerdeJsonWithString(Box<serde_json::Error>, Box<String>),
34    MpscRecvError(Box<std::sync::mpsc::RecvError>),
35    MpscSendError(Box<std::sync::mpsc::SendError<crate::tui::Event>>),
36    MpscSendError2(Box<std::sync::mpsc::SendError<crate::tui::app::pages::walletconnect::WcEvent>>),
37    MnemonicError(Box<coins_bip39::MnemonicError>),
38    AlloyLocalSignerError(Box<alloy::signers::local::LocalSignerError>),
39    FromUtf8Error(Box<std::string::FromUtf8Error>),
40    RpcError(Box<alloy::transports::RpcError<alloy::transports::TransportErrorKind>>),
41    UnitsError(Box<alloy::primitives::utils::UnitsError>),
42    AlloySignerError(Box<alloy::signers::Error>),
43    AlloyPendingTransactionError(Box<alloy::providers::PendingTransactionError>),
44    AlloyRlpError(Box<alloy::rlp::Error>),
45    AlloySolTypesError(alloy::sol_types::Error),
46    Abort(&'static str),
47    UrlParseError(Box<url::ParseError>),
48    Data3Error(Box<data3::error::Error>),
49    WalletConnectError(walletconnect_sdk::Error),
50    EyreError(Box<eyre::Report>), // TODO Helios should expose this
51}
52
53impl Error {
54    pub fn is_connect_reqwest(&self) -> bool {
55        match self {
56            Self::ReqwestError(error) => error.is_connect(),
57            _ => false,
58        }
59    }
60}
61
62impl FmtError for Error {
63    fn fmt_err(&self, id: &str) -> String {
64        if self.is_connect_reqwest() {
65            format!("Please check your internet connection - {id}: {self:#?}")
66        } else {
67            format!("{id}: {self:#?}")
68        }
69    }
70}
71
72impl FmtError for reqwest::Error {
73    fn fmt_err(&self, id: &str) -> String {
74        if self.is_connect() {
75            format!("Please check your internet connection - {id}: {self:?}")
76        } else {
77            format!("{id}: {self:?}")
78        }
79    }
80}
81
82impl Display for Error {
83    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
84        match self {
85            Error::AddressBook(s) => write!(f, "Error from AddressBook: {s}"),
86            _ => write!(f, "{self:?}"),
87        }
88    }
89}
90
91impl From<&str> for Error {
92    fn from(e: &str) -> Self {
93        Error::InternalError(e.to_string())
94    }
95}
96
97impl From<String> for Error {
98    fn from(e: String) -> Self {
99        Error::InternalError(e)
100    }
101}
102
103impl From<std::num::ParseIntError> for Error {
104    fn from(e: std::num::ParseIntError) -> Self {
105        Error::ParseIntError(Box::new(e))
106    }
107}
108
109impl From<std::num::ParseFloatError> for Error {
110    fn from(e: std::num::ParseFloatError) -> Self {
111        Error::ParseFloatError(Box::new(e))
112    }
113}
114
115impl From<alloy::hex::FromHexError> for Error {
116    fn from(e: alloy::hex::FromHexError) -> Self {
117        Error::FromHexError(Box::new(e))
118    }
119}
120
121impl From<std::io::Error> for Error {
122    fn from(e: std::io::Error) -> Self {
123        Error::IoError(Box::new(e))
124    }
125}
126
127#[cfg(target_os = "macos")]
128impl From<security_framework::base::Error> for Error {
129    fn from(e: security_framework::base::Error) -> Self {
130        Error::AppleSecurityFrameworkError(Box::new(e))
131    }
132}
133
134impl From<inquire::InquireError> for Error {
135    fn from(e: inquire::InquireError) -> Self {
136        Error::InquireError(Box::new(e))
137    }
138}
139
140impl From<alloy::signers::k256::ecdsa::Error> for Error {
141    fn from(e: alloy::signers::k256::ecdsa::Error) -> Self {
142        Error::AlloyEcdsaError(Box::new(e))
143    }
144}
145
146impl From<toml::de::Error> for Error {
147    fn from(e: toml::de::Error) -> Self {
148        Error::TomlDeError(Box::new(e))
149    }
150}
151
152impl From<toml::ser::Error> for Error {
153    fn from(e: toml::ser::Error) -> Self {
154        Error::TomlSerError(Box::new(e))
155    }
156}
157
158impl From<serde_yaml::Error> for Error {
159    fn from(e: serde_yaml::Error) -> Self {
160        Error::YamlError(Box::new(e))
161    }
162}
163
164impl From<reqwest::Error> for Error {
165    fn from(e: reqwest::Error) -> Self {
166        Error::ReqwestError(Box::new(e))
167    }
168}
169
170impl From<serde_json::Error> for Error {
171    fn from(e: serde_json::Error) -> Self {
172        Error::SerdeJson(Box::new(e))
173    }
174}
175
176impl From<std::sync::mpsc::RecvError> for Error {
177    fn from(e: std::sync::mpsc::RecvError) -> Self {
178        Error::MpscRecvError(Box::new(e))
179    }
180}
181
182impl From<std::sync::mpsc::SendError<crate::tui::Event>> for Error {
183    fn from(e: std::sync::mpsc::SendError<crate::tui::Event>) -> Self {
184        Error::MpscSendError(Box::new(e))
185    }
186}
187
188impl From<std::sync::mpsc::SendError<crate::tui::app::pages::walletconnect::WcEvent>> for Error {
189    fn from(e: std::sync::mpsc::SendError<crate::tui::app::pages::walletconnect::WcEvent>) -> Self {
190        Error::MpscSendError2(Box::new(e))
191    }
192}
193
194impl From<coins_bip39::MnemonicError> for Error {
195    fn from(e: coins_bip39::MnemonicError) -> Self {
196        Error::MnemonicError(Box::new(e))
197    }
198}
199
200impl From<alloy::signers::local::LocalSignerError> for Error {
201    fn from(e: alloy::signers::local::LocalSignerError) -> Self {
202        Error::AlloyLocalSignerError(Box::new(e))
203    }
204}
205
206impl From<std::string::FromUtf8Error> for Error {
207    fn from(e: std::string::FromUtf8Error) -> Self {
208        Error::FromUtf8Error(Box::new(e))
209    }
210}
211
212impl From<alloy::transports::RpcError<alloy::transports::TransportErrorKind>> for Error {
213    fn from(e: alloy::transports::RpcError<alloy::transports::TransportErrorKind>) -> Self {
214        Error::RpcError(Box::new(e))
215    }
216}
217
218impl From<alloy::primitives::utils::UnitsError> for Error {
219    fn from(e: alloy::primitives::utils::UnitsError) -> Self {
220        Error::UnitsError(Box::new(e))
221    }
222}
223
224impl From<alloy::signers::Error> for Error {
225    fn from(e: alloy::signers::Error) -> Self {
226        Error::AlloySignerError(Box::new(e))
227    }
228}
229
230impl From<alloy::providers::PendingTransactionError> for Error {
231    fn from(e: alloy::providers::PendingTransactionError) -> Self {
232        Error::AlloyPendingTransactionError(Box::new(e))
233    }
234}
235
236impl From<alloy::rlp::Error> for Error {
237    fn from(e: alloy::rlp::Error) -> Self {
238        Error::AlloyRlpError(Box::new(e))
239    }
240}
241
242impl From<alloy::sol_types::Error> for Error {
243    fn from(e: alloy::sol_types::Error) -> Self {
244        Error::AlloySolTypesError(e)
245    }
246}
247
248impl From<url::ParseError> for Error {
249    fn from(e: url::ParseError) -> Self {
250        Error::UrlParseError(Box::new(e))
251    }
252}
253
254impl From<data3::error::Error> for Error {
255    fn from(e: data3::error::Error) -> Self {
256        Error::Data3Error(Box::new(e))
257    }
258}
259
260impl From<walletconnect_sdk::Error> for Error {
261    fn from(e: walletconnect_sdk::Error) -> Self {
262        Error::WalletConnectError(e)
263    }
264}
265
266impl From<eyre::Report> for Error {
267    fn from(e: eyre::Report) -> Self {
268        Error::EyreError(Box::new(e))
269    }
270}
271
272pub trait FmtError {
273    fn fmt_err(&self, id: &str) -> String;
274}