error.rs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. use std::string::FromUtf8Error;
  2. use serde::{Deserialize, Serialize};
  3. use thiserror::Error;
  4. #[derive(Debug, Error)]
  5. pub enum Error {
  6. /// Parse Url Error
  7. #[error("`{0}`")]
  8. UrlParseError(#[from] url::ParseError),
  9. /// Utf8 parse error
  10. #[error("`{0}`")]
  11. Utf8ParseError(#[from] FromUtf8Error),
  12. /// Serde Json error
  13. #[error("`{0}`")]
  14. SerdeJsonError(#[from] serde_json::Error),
  15. /// Base64 error
  16. #[error("`{0}`")]
  17. Base64Error(#[from] base64::DecodeError),
  18. /// From hex error
  19. #[error("`{0}`")]
  20. HexError(#[from] hex::FromHexError),
  21. #[error("`{0}`")]
  22. EllipticCurve(#[from] k256::elliptic_curve::Error),
  23. #[error("`{0}`")]
  24. ECDSA(#[from] k256::ecdsa::Error),
  25. #[error("No Key for Amoun")]
  26. AmountKey,
  27. #[error("Amount miss match")]
  28. Amount,
  29. #[error("Token already spent")]
  30. TokenSpent,
  31. #[error("Token not verified")]
  32. TokenNotVerifed,
  33. #[error("Invoice Amount undefined")]
  34. InvoiceAmountUndefined,
  35. #[error("Proof missing required field")]
  36. MissingProofField,
  37. #[error("No valid point found")]
  38. NoValidPoint,
  39. #[error("Kind not found")]
  40. KindNotFound,
  41. #[error("Unknown Tag")]
  42. UnknownTag,
  43. #[error("Incorrect Secret Kind")]
  44. IncorrectSecretKind,
  45. #[error("Spending conditions not met")]
  46. SpendConditionsNotMet,
  47. #[error("Could not convert key")]
  48. Key,
  49. #[error("Invalid signature")]
  50. InvalidSignature,
  51. #[error("Locktime in past")]
  52. LocktimeInPast,
  53. #[error("`{0}`")]
  54. Secret(#[from] super::secret::Error),
  55. #[error("`{0}`")]
  56. NUT02(#[from] crate::nuts::nut02::Error),
  57. #[cfg(feature = "nut13")]
  58. #[error("`{0}`")]
  59. Bip32(#[from] bip32::Error),
  60. #[error("`{0}`")]
  61. ParseInt(#[from] std::num::ParseIntError),
  62. /// Custom error
  63. #[error("`{0}`")]
  64. CustomError(String),
  65. }
  66. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
  67. pub struct ErrorResponse {
  68. pub code: u32,
  69. pub error: Option<String>,
  70. pub detail: Option<String>,
  71. }
  72. impl ErrorResponse {
  73. pub fn from_json(json: &str) -> Result<Self, serde_json::Error> {
  74. if let Ok(res) = serde_json::from_str::<ErrorResponse>(json) {
  75. Ok(res)
  76. } else {
  77. Ok(Self {
  78. code: 999,
  79. error: Some(json.to_string()),
  80. detail: None,
  81. })
  82. }
  83. }
  84. }
  85. #[cfg(feature = "wallet")]
  86. pub mod wallet {
  87. use std::string::FromUtf8Error;
  88. use thiserror::Error;
  89. #[derive(Debug, Error)]
  90. pub enum Error {
  91. /// Serde Json error
  92. #[error("`{0}`")]
  93. SerdeJsonError(#[from] serde_json::Error),
  94. /// From elliptic curve
  95. #[error("`{0}`")]
  96. EllipticError(#[from] k256::elliptic_curve::Error),
  97. /// Insufficient Funds
  98. #[error("Insufficient funds")]
  99. InsufficientFunds,
  100. /// Utf8 parse error
  101. #[error("`{0}`")]
  102. Utf8ParseError(#[from] FromUtf8Error),
  103. /// Base64 error
  104. #[error("`{0}`")]
  105. Base64Error(#[from] base64::DecodeError),
  106. /// Unsupported Token
  107. #[error("Token unsupported")]
  108. UnsupportedToken,
  109. /// Token Requires proofs
  110. #[error("Proofs Required")]
  111. ProofsRequired,
  112. /// Url Parse error
  113. #[error("Url Parse")]
  114. UrlParse,
  115. #[error("`{0}`")]
  116. Secret(#[from] crate::secret::Error),
  117. #[error("`{0}`")]
  118. Cashu(#[from] super::Error),
  119. /// Custom Error message
  120. #[error("`{0}`")]
  121. CustomError(String),
  122. }
  123. impl From<crate::url::Error> for Error {
  124. fn from(_err: crate::url::Error) -> Error {
  125. Error::UrlParse
  126. }
  127. }
  128. }
  129. #[cfg(feature = "mint")]
  130. pub mod mint {
  131. use thiserror::Error;
  132. #[derive(Debug, Error)]
  133. pub enum Error {
  134. #[error("No key for amount")]
  135. AmountKey,
  136. #[error("Amount miss match")]
  137. Amount,
  138. #[error("Token Already Spent")]
  139. TokenSpent,
  140. /// From elliptic curve
  141. #[error("`{0}`")]
  142. EllipticError(#[from] k256::elliptic_curve::Error),
  143. #[error("`Token not verified`")]
  144. TokenNotVerifed,
  145. #[error("Invoice amount undefined")]
  146. InvoiceAmountUndefined,
  147. /// Duplicate Proofs sent in request
  148. #[error("Duplicate proofs")]
  149. DuplicateProofs,
  150. /// Keyset id not active
  151. #[error("Keyset id is not active")]
  152. InactiveKeyset,
  153. /// Keyset is not known
  154. #[error("Unknown Keyset")]
  155. UnknownKeySet,
  156. #[error("`{0}`")]
  157. Secret(#[from] crate::secret::Error),
  158. #[error("`{0}`")]
  159. Cashu(#[from] super::Error),
  160. #[error("`{0}`")]
  161. CustomError(String),
  162. }
  163. }