clndash: include listpeerchannel errors

in response

Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
William Casarin
2025-08-08 20:19:58 -07:00
parent 2444e24fb5
commit 8138a0a1ca

View File

@@ -25,7 +25,7 @@ pub struct ClnDash {
initialized: bool, initialized: bool,
connection_state: ConnectionState, connection_state: ConnectionState,
get_info: Option<String>, get_info: Option<String>,
channels: Option<Channels>, channels: Option<Result<Channels, lnsocket::Error>>,
channel: Option<CommChannel>, channel: Option<CommChannel>,
last_summary: Option<Summary>, last_summary: Option<Summary>,
} }
@@ -44,7 +44,7 @@ struct CommChannel {
/// Responses from the socket /// Responses from the socket
enum ClnResponse { enum ClnResponse {
GetInfo(Value), GetInfo(Value),
ListPeerChannels(Channels), ListPeerChannels(Result<Channels, lnsocket::Error>),
} }
#[derive(Deserialize, Serialize)] #[derive(Deserialize, Serialize)]
@@ -123,7 +123,7 @@ impl ClnDash {
.show(ui, |ui| { .show(ui, |ui| {
egui::ScrollArea::vertical().show(ui, |ui| { egui::ScrollArea::vertical().show(ui, |ui| {
connection_state_ui(ui, &self.connection_state); connection_state_ui(ui, &self.connection_state);
if let Some(ch) = self.channels.as_ref() { if let Some(Ok(ch)) = self.channels.as_ref() {
let summary = compute_summary(ch); let summary = compute_summary(ch);
summary_cards_ui(ui, &summary, self.last_summary.as_ref()); summary_cards_ui(ui, &summary, self.last_summary.as_ref());
ui.add_space(8.0); ui.add_space(8.0);
@@ -191,20 +191,15 @@ impl ClnDash {
}, },
Request::ListPeerChannels => { Request::ListPeerChannels => {
match commando.call("listpeerchannels", json!({})).await { let peer_channels =
Ok(v) => { commando.call("listpeerchannels", json!({})).await;
let peer_channels: Vec<ListPeerChannel> = let channels = peer_channels.map(|v| {
serde_json::from_value(v["channels"].clone()).unwrap(); let peer_channels: Vec<ListPeerChannel> =
let _ = event_tx.send(Event::Response( serde_json::from_value(v["channels"].clone()).unwrap();
ClnResponse::ListPeerChannels(to_channels( to_channels(peer_channels)
peer_channels, });
)), let _ = event_tx
)); .send(Event::Response(ClnResponse::ListPeerChannels(channels)));
}
Err(err) => {
tracing::error!("listpeerchannels error {}", err);
}
}
} }
} }
} }
@@ -232,7 +227,7 @@ impl ClnDash {
Event::Response(resp) => match resp { Event::Response(resp) => match resp {
ClnResponse::ListPeerChannels(chans) => { ClnResponse::ListPeerChannels(chans) => {
if let Some(prev) = self.channels.as_ref() { if let Some(Ok(prev)) = self.channels.as_ref() {
self.last_summary = Some(compute_summary(prev)); self.last_summary = Some(compute_summary(prev));
} }
self.channels = Some(chans); self.channels = Some(chans);
@@ -338,18 +333,28 @@ fn human_sat(msat: i64) -> String {
} }
} }
fn channels_ui(ui: &mut egui::Ui, channels: &Option<Channels>) { fn channels_ui(ui: &mut egui::Ui, channels: &Option<Result<Channels, lnsocket::Error>>) {
let Some(channels) = channels else { match channels {
ui.label("no channels"); Some(Ok(channels)) => {
return; if channels.channels.is_empty() {
}; ui.label("no channels yet...");
return;
}
for channel in &channels.channels { for channel in &channels.channels {
channel_ui(ui, channel, channels.max_total_msat); channel_ui(ui, channel, channels.max_total_msat);
}
ui.label(format!("available out {}", human_sat(channels.avail_out)));
ui.label(format!("available in {}", human_sat(channels.avail_in)));
}
Some(Err(err)) => {
ui.label(format!("error fetching channels: {err}"));
}
None => {
ui.label("no channels yet...");
}
} }
ui.label(format!("available out {}", human_sat(channels.avail_out)));
ui.label(format!("available in {}", human_sat(channels.avail_in)));
} }
fn to_channels(peer_channels: Vec<ListPeerChannel>) -> Channels { fn to_channels(peer_channels: Vec<ListPeerChannel>) -> Channels {