Skip to content

Commit a0e1a41

Browse files
committed
Display when fallback is available in aborted cli sessions
Before this change there was no reasonable way of knowing which session had a fallback transaction available meaning that if the session was closed with `payjoin-cli cancel # --no-broadcast` a user would have to enumerate through all the sessions trying to look for which session had the fallback tx.
1 parent 659fcc9 commit a0e1a41

1 file changed

Lines changed: 31 additions & 4 deletions

File tree

payjoin-cli/src/app/v2/mod.rs

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,16 +112,23 @@ struct SessionHistoryRow<Status> {
112112
role: Role,
113113
status: Status,
114114
error_message: Option<String>,
115+
fallback_available: bool,
115116
}
116117

117118
impl<Status: StatusText> fmt::Display for SessionHistoryRow<Status> {
118119
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
120+
let status_text = match (self.error_message.as_deref(), self.fallback_available) {
121+
(Some(err), _) => err.to_string(),
122+
(None, true) =>
123+
format!("{}, Fallback transaction available", self.status.status_text()),
124+
(None, false) => self.status.status_text().to_string(),
125+
};
119126
write!(
120127
f,
121128
"{:<W_ID$} {:<W_ROLE$} {:<W_STATUS$}",
122129
self.session_id.to_string(),
123130
self.role.as_str(),
124-
self.error_message.as_deref().unwrap_or(self.status.status_text())
131+
status_text
125132
)
126133
}
127134
}
@@ -400,12 +407,15 @@ impl AppTrait for App {
400407
self.db.get_send_session_ids()?.into_iter().for_each(|session_id| {
401408
let persister = SenderPersister::from_id(self.db.clone(), session_id.clone());
402409
match replay_sender_event_log(&persister) {
403-
Ok((sender_state, _)) => {
410+
Ok((sender_state, _session_history)) => {
411+
let fallback_available =
412+
matches!(sender_state, SendSession::Closed(SenderSessionOutcome::Aborted));
404413
let row = SessionHistoryRow {
405414
session_id,
406415
role: Role::Sender,
407416
status: sender_state.clone(),
408417
error_message: None,
418+
fallback_available,
409419
};
410420
send_rows.push(row);
411421
}
@@ -415,6 +425,7 @@ impl AppTrait for App {
415425
role: Role::Sender,
416426
status: SendSession::Closed(SenderSessionOutcome::Aborted),
417427
error_message: Some(e.to_string()),
428+
fallback_available: false,
418429
};
419430
send_rows.push(row);
420431
}
@@ -424,12 +435,17 @@ impl AppTrait for App {
424435
self.db.get_recv_session_ids()?.into_iter().for_each(|session_id| {
425436
let persister = ReceiverPersister::from_id(self.db.clone(), session_id.clone());
426437
match replay_receiver_event_log(&persister) {
427-
Ok((receiver_state, _)) => {
438+
Ok((receiver_state, session_history)) => {
439+
let fallback_available = matches!(
440+
receiver_state,
441+
ReceiveSession::Closed(ReceiverSessionOutcome::Aborted)
442+
) && session_history.fallback_tx().is_some();
428443
let row = SessionHistoryRow {
429444
session_id,
430445
role: Role::Receiver,
431446
status: receiver_state.clone(),
432447
error_message: None,
448+
fallback_available,
433449
};
434450
recv_rows.push(row);
435451
}
@@ -439,6 +455,7 @@ impl AppTrait for App {
439455
role: Role::Receiver,
440456
status: ReceiveSession::Closed(ReceiverSessionOutcome::Aborted),
441457
error_message: Some(e.to_string()),
458+
fallback_available: false,
442459
};
443460
recv_rows.push(row);
444461
}
@@ -449,11 +466,14 @@ impl AppTrait for App {
449466
let persister = SenderPersister::from_id(self.db.clone(), session_id.clone());
450467
match replay_sender_event_log(&persister) {
451468
Ok((sender_state, _)) => {
469+
let fallback_available =
470+
matches!(sender_state, SendSession::Closed(SenderSessionOutcome::Aborted));
452471
let row = SessionHistoryRow {
453472
session_id,
454473
role: Role::Sender,
455474
status: sender_state.clone(),
456475
error_message: None,
476+
fallback_available,
457477
};
458478
send_rows.push(row);
459479
}
@@ -463,6 +483,7 @@ impl AppTrait for App {
463483
role: Role::Sender,
464484
status: SendSession::Closed(SenderSessionOutcome::Aborted),
465485
error_message: Some(e.to_string()),
486+
fallback_available: false,
466487
};
467488
send_rows.push(row);
468489
}
@@ -472,12 +493,17 @@ impl AppTrait for App {
472493
self.db.get_inactive_recv_session_ids()?.into_iter().for_each(|(session_id, _)| {
473494
let persister = ReceiverPersister::from_id(self.db.clone(), session_id.clone());
474495
match replay_receiver_event_log(&persister) {
475-
Ok((receiver_state, _)) => {
496+
Ok((receiver_state, session_history)) => {
497+
let fallback_available = matches!(
498+
receiver_state,
499+
ReceiveSession::Closed(ReceiverSessionOutcome::Aborted)
500+
) && session_history.fallback_tx().is_some();
476501
let row = SessionHistoryRow {
477502
session_id,
478503
role: Role::Receiver,
479504
status: receiver_state.clone(),
480505
error_message: None,
506+
fallback_available,
481507
};
482508
recv_rows.push(row);
483509
}
@@ -487,6 +513,7 @@ impl AppTrait for App {
487513
role: Role::Receiver,
488514
status: ReceiveSession::Closed(ReceiverSessionOutcome::Aborted),
489515
error_message: Some(e.to_string()),
516+
fallback_available: false,
490517
};
491518
recv_rows.push(row);
492519
}

0 commit comments

Comments
 (0)