From 446fb9eb4592ca47d905069c166483ce519b6e48 Mon Sep 17 00:00:00 2001 From: LORDBABUINO Date: Mon, 11 May 2026 20:18:52 -0300 Subject: [PATCH] refactor(api): use match for scan input validation The if-chain and counter pattern is a 5-arm tuple match in disguise. Pattern match on (descriptor, descriptors, utxos) directly: every valid case picks exactly one variant, the empty tuple is a clear missing-input error, and the wildcard catches mutual-exclusion violations. --- api/src/routes/wallet.rs | 38 +++++++------------------------------- 1 file changed, 7 insertions(+), 31 deletions(-) diff --git a/api/src/routes/wallet.rs b/api/src/routes/wallet.rs index 1c23cc4..10d817a 100644 --- a/api/src/routes/wallet.rs +++ b/api/src/routes/wallet.rs @@ -41,39 +41,15 @@ async fn scan_post( impl ScanRequestBody { fn into_scan_target(self) -> Result { - let mut selected_sources = 0usize; - if self.descriptor.is_some() { - selected_sources += 1; - } - if self.descriptors.is_some() { - selected_sources += 1; - } - if self.utxos.is_some() { - selected_sources += 1; - } - - if selected_sources == 0 { - return Err(ApiError::bad_request( + match (self.descriptor, self.descriptors, self.utxos) { + (Some(d), None, None) => Ok(ScanTarget::Descriptor(d)), + (None, Some(ds), None) => Ok(ScanTarget::Descriptors(ds)), + (None, None, Some(utxos)) => Ok(ScanTarget::Utxos(utxos)), + (None, None, None) => Err(ApiError::bad_request( "one input source is required: descriptor, descriptors, or utxos", - )); + )), + _ => Err(ApiError::bad_request("provide exactly one input source")), } - if selected_sources > 1 { - return Err(ApiError::bad_request( - "descriptor, descriptors, and utxos are mutually exclusive", - )); - } - - if let Some(descriptor) = self.descriptor { - return Ok(ScanTarget::Descriptor(descriptor)); - } - if let Some(descriptors) = self.descriptors { - return Ok(ScanTarget::Descriptors(descriptors)); - } - if let Some(utxos) = self.utxos { - return Ok(ScanTarget::Utxos(utxos)); - } - - Err(ApiError::bad_request("invalid scan request body")) } }