Skip to content

Commit 974c8d5

Browse files
committed
refactor(payjoin): add payjoin error variants to BDKCliError
Replace Error::Generic with specific Payjoin error variants using #[from] derives for applicable places, enabling automatic conversion and eliminating verbose .map_err() calls.
1 parent 35d8313 commit 974c8d5

File tree

2 files changed

+40
-56
lines changed

2 files changed

+40
-56
lines changed

src/error.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,34 @@ pub enum BDKCliError {
112112
))]
113113
#[error("Reqwest error: {0}")]
114114
ReqwestError(#[from] reqwest::Error),
115+
116+
#[cfg(feature = "payjoin")]
117+
#[error("Payjoin URL parse error: {0}")]
118+
PayjoinUrlParse(#[from] payjoin::IntoUrlError),
119+
120+
#[cfg(feature = "payjoin")]
121+
#[error("Payjoin send response error: {0}")]
122+
PayjoinSendResponse(#[from] payjoin::send::ResponseError),
123+
124+
#[cfg(feature = "payjoin")]
125+
#[error("Payjoin sender build error: {0}")]
126+
PayjoinSenderBuild(#[from] payjoin::send::BuildSenderError),
127+
128+
#[cfg(feature = "payjoin")]
129+
#[error("Payjoin receive error: {0}")]
130+
PayjoinReceive(#[from] payjoin::receive::Error),
131+
132+
#[cfg(feature = "payjoin")]
133+
#[error("Payjoin selection error: {0}")]
134+
PayjoinSelection(#[from] payjoin::receive::SelectionError),
135+
136+
#[cfg(feature = "payjoin")]
137+
#[error("Payjoin input contribution error: {0}")]
138+
PayjoinInputContribution(#[from] payjoin::receive::InputContributionError),
139+
140+
#[cfg(feature = "payjoin")]
141+
#[error("Payjoin create request error: {0}")]
142+
PayjoinCreateRequest(#[from] payjoin::send::v2::CreateRequestError),
115143
}
116144

117145
impl From<ExtractTxError> for BDKCliError {

src/payjoin/mod.rs

Lines changed: 12 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,7 @@ impl<'a> PayjoinManager<'a> {
8282
address.address,
8383
directory,
8484
ohttp_keys.ohttp_keys,
85-
)
86-
.map_err(|e| {
87-
Error::Generic(format!(
88-
"Failed to initialize a Payjoin ReceiverBuilder: {e}"
89-
))
90-
})?
85+
)?
9186
.with_amount(payjoin::bitcoin::Amount::from_sat(amount))
9287
.with_max_fee_rate(checked_max_fee_rate)
9388
.build()
@@ -143,11 +138,7 @@ impl<'a> PayjoinManager<'a> {
143138
.add_recipient(uri.address.script_pubkey(), sats)
144139
.fee_rate(fee_rate);
145140

146-
tx_builder.finish().map_err(|e| {
147-
Error::Generic(format!(
148-
"Error occurred when building original Payjoin transaction: {e}"
149-
))
150-
})?
141+
tx_builder.finish()?
151142
};
152143
if !self
153144
.wallet
@@ -161,20 +152,11 @@ impl<'a> PayjoinManager<'a> {
161152
let txid = match uri.extras.pj_param() {
162153
payjoin::PjParam::V1(_) => {
163154
let (req, ctx) = payjoin::send::v1::SenderBuilder::new(original_psbt.clone(), uri)
164-
.build_recommended(fee_rate)
165-
.map_err(|e| {
166-
Error::Generic(format!("Failed to build a Payjoin v1 sender: {e}"))
167-
})?
155+
.build_recommended(fee_rate)?
168156
.create_v1_post_request();
169157

170-
let response = self
171-
.send_payjoin_post_request(req)
172-
.await
173-
.map_err(|e| Error::Generic(format!("Failed to send request: {e}")))?;
174-
175-
let psbt = ctx
176-
.process_response(&response.bytes().await?)
177-
.map_err(|e| Error::Generic(format!("Failed to send a Payjoin v1: {e}")))?;
158+
let response = self.send_payjoin_post_request(req).await?;
159+
let psbt = ctx.process_response(&response.bytes().await?)?;
178160

179161
self.process_payjoin_proposal(psbt, blockchain_client)
180162
.await?
@@ -199,10 +181,7 @@ impl<'a> PayjoinManager<'a> {
199181
payjoin::persist::NoopSessionPersister::<SenderSessionEvent>::default();
200182

201183
let sender = payjoin::send::v2::SenderBuilder::new(original_psbt.clone(), uri)
202-
.build_recommended(fee_rate)
203-
.map_err(|e| {
204-
Error::Generic(format!("Failed to build a Payjoin v2 sender: {e}"))
205-
})?
184+
.build_recommended(fee_rate)?
206185
.save(&persister)
207186
.map_err(|e| {
208187
Error::Generic(format!(
@@ -310,14 +289,7 @@ impl<'a> PayjoinManager<'a> {
310289
) -> Result<(), Error> {
311290
let mut current_receiver_typestate = receiver;
312291
let next_receiver_typestate = loop {
313-
let (req, context) = current_receiver_typestate
314-
.create_poll_request(relay.as_str())
315-
.map_err(|e| {
316-
Error::Generic(format!(
317-
"Failed to create a poll request to read from the Payjoin directory: {e}"
318-
))
319-
})?;
320-
println!("Polling receive request...");
292+
let (req, context) = current_receiver_typestate.create_poll_request(relay.as_str())?;
321293
let response = self.send_payjoin_post_request(req).await?;
322294
let state_transition = current_receiver_typestate
323295
.process_response(response.bytes().await?.to_vec().as_slice(), context)
@@ -503,18 +475,10 @@ impl<'a> PayjoinManager<'a> {
503475
.expect("Failed to create InputPair when contributing outputs to the proposal")
504476
})
505477
.collect();
506-
let selected_input = receiver
507-
.try_preserving_privacy(candidate_inputs)
508-
.map_err(|e| {
509-
Error::Generic(format!(
510-
"Error occurred when trying to pick an unspent UTXO for input contribution: {e}"
511-
))
512-
})?;
478+
let selected_input = receiver.try_preserving_privacy(candidate_inputs)?;
513479

514-
let next_receiver_typestate = receiver.contribute_inputs(vec![selected_input])
515-
.map_err(|e| {
516-
Error::Generic(format!("Error occurred when contributing the selected input to the proposal: {e}"))
517-
})?.commit_inputs().save(persister)
480+
let next_receiver_typestate = receiver.contribute_inputs(vec![selected_input])?
481+
.commit_inputs().save(persister)
518482
.map_err(|e| {
519483
Error::Generic(format!("Error occurred when saving after committing to the inputs after receiver contribution: {e}"))
520484
})?;
@@ -777,11 +741,7 @@ impl<'a> PayjoinManager<'a> {
777741
persister: &impl SessionPersister<SessionEvent = SenderSessionEvent>,
778742
blockchain_client: &BlockchainClient,
779743
) -> Result<Txid, Error> {
780-
let (req, ctx) = sender.create_v2_post_request(relay.as_str()).map_err(|e| {
781-
Error::Generic(format!(
782-
"Failed to create a post request for a Payjoin send: {e}"
783-
))
784-
})?;
744+
let (req, ctx) = sender.create_v2_post_request(relay.as_str())?;
785745
let response = self.send_payjoin_post_request(req).await?;
786746
let sender = sender
787747
.process_response(&response.bytes().await?, ctx)
@@ -802,11 +762,7 @@ impl<'a> PayjoinManager<'a> {
802762
) -> Result<Txid, Error> {
803763
let mut sender = sender.clone();
804764
loop {
805-
let (req, ctx) = sender.create_poll_request(relay.as_str()).map_err(|e| {
806-
Error::Generic(format!(
807-
"Failed to create a poll request during a Payjoin send: {e}"
808-
))
809-
})?;
765+
let (req, ctx) = sender.create_poll_request(relay.as_str())?;
810766
let response = self.send_payjoin_post_request(req).await?;
811767
let processed_response = sender
812768
.process_response(&response.bytes().await?, ctx)

0 commit comments

Comments
 (0)