Bläddra i källkod

fix: error respose detail (#1090)

thesimplekid 1 månad sedan
förälder
incheckning
944cf2ae0b
1 ändrade filer med 42 tillägg och 75 borttagningar
  1. 42 75
      crates/cdk-common/src/error.rs

+ 42 - 75
crates/cdk-common/src/error.rs

@@ -419,32 +419,21 @@ pub enum Error {
 pub struct ErrorResponse {
     /// Error Code
     pub code: ErrorCode,
-    /// Human readable Text
-    pub error: Option<String>,
-    /// Longer human readable description
-    pub detail: Option<String>,
+    /// Human readable description
+    #[serde(default)]
+    pub detail: String,
 }
 
 impl fmt::Display for ErrorResponse {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        write!(
-            f,
-            "code: {}, error: {}, detail: {}",
-            self.code,
-            self.error.clone().unwrap_or_default(),
-            self.detail.clone().unwrap_or_default()
-        )
+        write!(f, "code: {}, detail: {}", self.code, self.detail)
     }
 }
 
 impl ErrorResponse {
     /// Create new [`ErrorResponse`]
-    pub fn new(code: ErrorCode, error: Option<String>, detail: Option<String>) -> Self {
-        Self {
-            code,
-            error,
-            detail,
-        }
+    pub fn new(code: ErrorCode, detail: String) -> Self {
+        Self { code, detail }
     }
 
     /// Error response from json
@@ -460,8 +449,7 @@ impl ErrorResponse {
             Ok(res) => Ok(res),
             Err(_) => Ok(Self {
                 code: ErrorCode::Unknown(999),
-                error: Some(value.to_string()),
-                detail: None,
+                detail: value.to_string(),
             }),
         }
     }
@@ -482,139 +470,118 @@ impl From<Error> for ErrorResponse {
         match err {
             Error::TokenAlreadySpent => ErrorResponse {
                 code: ErrorCode::TokenAlreadySpent,
-                error: Some(err.to_string()),
-                detail: None,
+                detail: err.to_string(),
             },
             Error::UnsupportedUnit => ErrorResponse {
                 code: ErrorCode::UnsupportedUnit,
-                error: Some(err.to_string()),
-                detail: None,
+                detail: err.to_string(),
             },
             Error::PaymentFailed => ErrorResponse {
                 code: ErrorCode::LightningError,
-                error: Some(err.to_string()),
-                detail: None,
+                detail: err.to_string(),
             },
             Error::RequestAlreadyPaid => ErrorResponse {
                 code: ErrorCode::InvoiceAlreadyPaid,
-                error: Some("Invoice already paid.".to_string()),
-                detail: None,
+                detail: "Invoice already paid.".to_string(),
             },
             Error::TransactionUnbalanced(inputs_total, outputs_total, fee_expected) => {
                 ErrorResponse {
                     code: ErrorCode::TransactionUnbalanced,
-                    error: Some(format!(
-                        "Inputs: {inputs_total}, Outputs: {outputs_total}, expected_fee: {fee_expected}",
-                    )),
-                    detail: Some("Transaction inputs should equal outputs less fee".to_string()),
+                    detail: format!(
+                        "Inputs: {inputs_total}, Outputs: {outputs_total}, expected_fee: {fee_expected}. Transaction inputs should equal outputs less fee"
+                    ),
                 }
             }
             Error::MintingDisabled => ErrorResponse {
                 code: ErrorCode::MintingDisabled,
-                error: Some(err.to_string()),
-                detail: None,
+                detail: err.to_string(),
             },
             Error::BlindedMessageAlreadySigned => ErrorResponse {
                 code: ErrorCode::BlindedMessageAlreadySigned,
-                error: Some(err.to_string()),
-                detail: None,
+                detail: err.to_string(),
             },
             Error::InsufficientFunds => ErrorResponse {
                 code: ErrorCode::TransactionUnbalanced,
-                error: Some(err.to_string()),
-                detail: None,
+                detail: err.to_string(),
             },
             Error::AmountOutofLimitRange(_min, _max, _amount) => ErrorResponse {
                 code: ErrorCode::AmountOutofLimitRange,
-                error: Some(err.to_string()),
-                detail: None,
+                detail: err.to_string(),
             },
             Error::ExpiredQuote(_, _) => ErrorResponse {
                 code: ErrorCode::QuoteExpired,
-                error: Some(err.to_string()),
-                detail: None,
+                detail: err.to_string(),
             },
             Error::PendingQuote => ErrorResponse {
                 code: ErrorCode::QuotePending,
-                error: Some(err.to_string()),
-                detail: None,
+                detail: err.to_string(),
             },
             Error::TokenPending => ErrorResponse {
                 code: ErrorCode::TokenPending,
-                error: Some(err.to_string()),
-                detail: None,
+                detail: err.to_string(),
             },
             Error::ClearAuthRequired => ErrorResponse {
                 code: ErrorCode::ClearAuthRequired,
-                error: None,
-                detail: None,
+                detail: Error::ClearAuthRequired.to_string(),
             },
             Error::ClearAuthFailed => ErrorResponse {
                 code: ErrorCode::ClearAuthFailed,
-                error: None,
-                detail: None,
+                detail: Error::ClearAuthFailed.to_string(),
             },
             Error::BlindAuthRequired => ErrorResponse {
                 code: ErrorCode::BlindAuthRequired,
-                error: None,
-                detail: None,
+                detail: Error::BlindAuthRequired.to_string(),
             },
             Error::BlindAuthFailed => ErrorResponse {
                 code: ErrorCode::BlindAuthFailed,
-                error: None,
-                detail: None,
+                detail: Error::BlindAuthFailed.to_string(),
             },
             Error::NUT20(err) => ErrorResponse {
                 code: ErrorCode::WitnessMissingOrInvalid,
-                error: Some(err.to_string()),
-                detail: None,
+                detail: err.to_string(),
             },
             Error::DuplicateInputs => ErrorResponse {
                 code: ErrorCode::DuplicateInputs,
-                error: Some(err.to_string()),
-                detail: None,
+                detail: err.to_string(),
             },
             Error::DuplicateOutputs => ErrorResponse {
                 code: ErrorCode::DuplicateOutputs,
-                error: Some(err.to_string()),
-                detail: None,
+                detail: err.to_string(),
             },
             Error::MultipleUnits => ErrorResponse {
                 code: ErrorCode::MultipleUnits,
-                error: Some(err.to_string()),
-                detail: None,
+                detail: err.to_string(),
             },
             Error::UnitMismatch => ErrorResponse {
                 code: ErrorCode::UnitMismatch,
-                error: Some(err.to_string()),
-                detail: None,
+                detail: err.to_string(),
             },
             Error::UnpaidQuote => ErrorResponse {
                 code: ErrorCode::QuoteNotPaid,
-                error: Some(err.to_string()),
-                detail: None
+                detail: Error::UnpaidQuote.to_string(),
             },
             Error::NUT11(err) => {
                 let code = map_nut11_error(&err);
-                let mut detail = None;
-                if matches!(err, crate::nuts::nut11::Error::SignaturesNotProvided) {
-                    detail = Some("P2PK signatures are required but not provided".to_string());
-                }
+                let extra = if matches!(err, crate::nuts::nut11::Error::SignaturesNotProvided) {
+                    Some("P2PK signatures are required but not provided".to_string())
+                } else {
+                    None
+                };
                 ErrorResponse {
                     code,
-                    error: Some(err.to_string()),
-                    detail,
+                    detail: match extra {
+                        Some(extra) => format!("{err}. {extra}"),
+                        None => err.to_string(),
+                    },
                 }
             },
             Error::DuplicateSignatureError => ErrorResponse {
                 code: ErrorCode::DuplicateSignature,
-                error: Some(err.to_string()),
-                detail: None,
+                detail: err.to_string(),
             },
             _ => ErrorResponse {
                 code: ErrorCode::Unknown(9999),
-                error: Some(err.to_string()),
-                detail: None,
+                detail: err.to_string(),
             },
         }
     }