Skip to content

Commit

Permalink
improve: use thiserror
Browse files Browse the repository at this point in the history
  • Loading branch information
thesimplekid committed Nov 10, 2023
1 parent f797bf2 commit f85df73
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 142 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,4 @@ tokio = { version = "1.32", default-features = false }
tracing = { version = "0.1", default-features = false }
tracing-subscriber = "0.3"
uniffi = "0.24"

thiserror = "1.0.50"
1 change: 1 addition & 0 deletions crates/cashu/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ serde_json = { workspace = true }
url = { workspace = true }
regex = "1.8.4"
itertools = "0.11.0"
thiserror = { workspace = true }

[dev-dependencies]
# tokio = {version = "1.27.0", features = ["rt", "macros"] }
188 changes: 47 additions & 141 deletions crates/cashu/src/error.rs
Original file line number Diff line number Diff line change
@@ -1,155 +1,77 @@
use std::error::Error as StdError;
use std::fmt;
use std::string::FromUtf8Error;

#[derive(Debug)]
use thiserror::Error;

#[derive(Debug, Error)]
pub enum Error {
/// Parse Url Error
UrlParseError(url::ParseError),
#[error("`{0}`")]
UrlParseError(#[from] url::ParseError),
/// Utf8 parse error
Utf8ParseError(FromUtf8Error),
#[error("`{0}`")]
Utf8ParseError(#[from] FromUtf8Error),
/// Serde Json error
#[error("`{0}`")]
SerdeJsonError(serde_json::Error),
/// Base64 error
Base64Error(base64::DecodeError),
#[error("`{0}`")]
Base64Error(#[from] base64::DecodeError),
#[error("`{0}`")]
CustomError(String),
/// From hex error
HexError(hex::FromHexError),
EllipticCurve(k256::elliptic_curve::Error),
#[error("`{0}`")]
HexError(#[from] hex::FromHexError),
#[error("`{0}`")]
EllipticCurve(#[from] k256::elliptic_curve::Error),
#[error("No Key for Amoun")]
AmountKey,
#[error("Amount miss match")]
Amount,
#[error("Token already spent")]
TokenSpent,
#[error("Token not verified")]
TokenNotVerifed,
#[error("Invoice Amount undefined")]
InvoiceAmountUndefined,
}

impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::UrlParseError(err) => write!(f, "{}", err),
Error::Utf8ParseError(err) => write!(f, "{}", err),
Error::SerdeJsonError(err) => write!(f, "{}", err),
Error::Base64Error(err) => write!(f, "{}", err),
Error::CustomError(err) => write!(f, "{}", err),
Error::HexError(err) => write!(f, "{}", err),
Error::AmountKey => write!(f, "No Key for amount"),
Error::Amount => write!(f, "Amount miss match."),
Error::TokenSpent => write!(f, "Token Spent"),
Error::TokenNotVerifed => write!(f, "Token Not Verified"),
Error::InvoiceAmountUndefined => write!(f, "Invoice without amount"),
Error::EllipticCurve(err) => write!(f, "{}", err),
}
}
}

impl StdError for Error {}

impl From<url::ParseError> for Error {
fn from(err: url::ParseError) -> Error {
Error::UrlParseError(err)
}
}

impl From<FromUtf8Error> for Error {
fn from(err: FromUtf8Error) -> Error {
Error::Utf8ParseError(err)
}
}

impl From<serde_json::Error> for Error {
fn from(err: serde_json::Error) -> Error {
Error::SerdeJsonError(err)
}
}

impl From<base64::DecodeError> for Error {
fn from(err: base64::DecodeError) -> Error {
Error::Base64Error(err)
}
}

impl From<hex::FromHexError> for Error {
fn from(err: hex::FromHexError) -> Error {
Error::HexError(err)
}
}

impl From<k256::elliptic_curve::Error> for Error {
fn from(err: k256::elliptic_curve::Error) -> Error {
Error::EllipticCurve(err)
}
}

#[cfg(feature = "wallet")]
pub mod wallet {
use std::error::Error as StdError;
use std::fmt;
use std::string::FromUtf8Error;

#[derive(Debug)]
use thiserror::Error;

#[derive(Debug, Error)]
pub enum Error {
/// Serde Json error
SerdeJsonError(serde_json::Error),
#[error("`{0}`")]
SerdeJsonError(#[from] serde_json::Error),
/// From elliptic curve
EllipticError(k256::elliptic_curve::Error),
#[error("`{0}`")]
EllipticError(#[from] k256::elliptic_curve::Error),
/// Insufficient Funds
#[error("Insufficient funds")]
InsufficientFunds,
/// Utf8 parse error
Utf8ParseError(FromUtf8Error),
#[error("`{0}`")]
Utf8ParseError(#[from] FromUtf8Error),
/// Base64 error
Base64Error(base64::DecodeError),
#[error("`{0}`")]
Base64Error(#[from] base64::DecodeError),
/// Unsupported Token
#[error("Token unsupported")]
UnsupportedToken,
/// Token Requires proofs
#[error("Proofs Required")]
ProofsRequired,
/// Url Parse error
#[error("Url Parse")]
UrlParse,
/// Custom Error message
#[error("`{0}`")]
CustomError(String),
}

impl StdError for Error {}

impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::CustomError(err) => write!(f, "{}", err),
Error::InsufficientFunds => write!(f, "Insufficient Funds"),
Error::Utf8ParseError(err) => write!(f, "{}", err),
Error::Base64Error(err) => write!(f, "{}", err),
Error::UnsupportedToken => write!(f, "Unsuppported Token"),
Error::EllipticError(err) => write!(f, "{}", err),
Error::SerdeJsonError(err) => write!(f, "{}", err),
Error::UrlParse => write!(f, "Could not parse url"),
Error::ProofsRequired => write!(f, "Token must have at least one proof",),
}
}
}

impl From<serde_json::Error> for Error {
fn from(err: serde_json::Error) -> Error {
Error::SerdeJsonError(err)
}
}

impl From<k256::elliptic_curve::Error> for Error {
fn from(err: k256::elliptic_curve::Error) -> Error {
Error::EllipticError(err)
}
}

impl From<FromUtf8Error> for Error {
fn from(err: FromUtf8Error) -> Error {
Error::Utf8ParseError(err)
}
}

impl From<base64::DecodeError> for Error {
fn from(err: base64::DecodeError) -> Error {
Error::Base64Error(err)
}
}

impl From<crate::url::Error> for Error {
fn from(_err: crate::url::Error) -> Error {
Error::UrlParse
Expand All @@ -159,43 +81,27 @@ pub mod wallet {

#[cfg(feature = "mint")]
pub mod mint {
use std::error::Error as StdError;
use std::fmt;
use thiserror::Error;

#[derive(Debug)]
#[derive(Debug, Error)]
pub enum Error {
#[error("No key for amount")]
AmountKey,
#[error("Amount miss match")]
Amount,
#[error("Token Already Spent")]
TokenSpent,
/// From elliptic curve
EllipticError(k256::elliptic_curve::Error),
#[error("`{0}`")]
EllipticError(#[from] k256::elliptic_curve::Error),
#[error("`Token not verified`")]
TokenNotVerifed,
#[error("Invoice amount undefined")]
InvoiceAmountUndefined,
/// Duplicate Proofs sent in request
#[error("Duplicate proofs")]
DuplicateProofs,
#[error("`{0}`")]
CustomError(String),
}

impl StdError for Error {}

impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::AmountKey => write!(f, "No Key for amount"),
Error::Amount => write!(f, "Amount miss match"),
Error::TokenSpent => write!(f, "Token Spent"),
Error::EllipticError(err) => write!(f, "{}", err),
Error::CustomError(err) => write!(f, "{}", err),
Error::TokenNotVerifed => write!(f, "Token Not Verified"),
Error::InvoiceAmountUndefined => write!(f, "Invoice without amount"),
Error::DuplicateProofs => write!(f, "Request has duplicate proofs"),
}
}
}

impl From<k256::elliptic_curve::Error> for Error {
fn from(err: k256::elliptic_curve::Error) -> Error {
Error::EllipticError(err)
}
}
}

0 comments on commit f85df73

Please sign in to comment.