Error Handling
The error handling enum is WalletError. Since Rust error handling requires a Result<T, WalletError this type is wrapped in a pub type WalletResult
Formatting
The WalletError type implements std::fmt::Debug {:?} trait and user friendly std::fmt::Display {} trait. The WalletError::JsError{name: String, message: String, stack: String} variant has an exception for std::fmt::Display {} which only takes the message field from and uses that for std::fmt::Display in order to avoid overwhelming the user with the stack part of the error.
If a developer wishes to show the name, and stack messages too, the should use the std::fmt::Debug {:?} option.
Re-usable error handling
The variant WalletError::Op(String) is a convenience variant for error that happen outside of this wallet-adapter library. This variant is useful when you want to return a String error but don't want to implement custom error handling for ? .
Example:
#![allow(unused)] fn main() { use wallet_adapter::WalletAdapter; // Without WalletError::Op variant async fn foo() -> Result<(), CustomError> { let adapter = WalletAdapter::init()?; // This returns a `WalletError` let connect = adapter.connect(wallet).await?; // This returns a `WalletError` let task_that_returns_error = process().await?; // This returns a `String` as error } async fn process() -> Result<(), String> { // A background task that may return an error } }
In this code one has to implement From or TryFrom trait in order to convert a WalletError to a Result<(), CustomError> whenever they call ? on process.await().
Instead, if the error implements std::fmt::Display like String, you can use WalletEvent::Op(String) instead:
#![allow(unused)] fn main() { use wallet_adapter::{WalletAdapter, WalletResult, WalletError}; // Without WalletError::Op variant async fn foo() -> WalletResult<()> { let adapter = WalletAdapter::init()?; // This returns a `WalletError` let connect = adapter.connect(wallet).await?; // This returns a `WalletError` // Map the `String` as error into `WalletError::Op(String)` let task_that_returns_error = process().await.map_err(|error| WalletError(error))?; } async fn process() -> Result<(), String> { // A background task that may return an error } }