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>), }
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}