use std::sync::Arc;
#[cfg(feature = "uniffi")]
use lightning::ln::msgs::SocketAddress;
use lightning::routing::gossip::NodeId;
#[cfg(feature = "uniffi")]
use lightning::routing::gossip::RoutingFees;
#[cfg(not(feature = "uniffi"))]
use lightning::routing::gossip::{ChannelInfo, NodeInfo};
use crate::types::Graph;
pub struct NetworkGraph {
inner: Arc<Graph>,
}
impl NetworkGraph {
pub(crate) fn new(inner: Arc<Graph>) -> Self {
Self { inner }
}
pub fn list_channels(&self) -> Vec<u64> {
self.inner.read_only().channels().unordered_keys().map(|c| *c).collect()
}
pub fn channel(&self, short_channel_id: u64) -> Option<ChannelInfo> {
self.inner.read_only().channels().get(&short_channel_id).cloned().map(|c| c.into())
}
pub fn list_nodes(&self) -> Vec<NodeId> {
self.inner.read_only().nodes().unordered_keys().map(|n| *n).collect()
}
pub fn node(&self, node_id: &NodeId) -> Option<NodeInfo> {
self.inner.read_only().nodes().get(node_id).cloned().map(|n| n.into())
}
}
#[cfg(feature = "uniffi")]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ChannelInfo {
pub node_one: NodeId,
pub one_to_two: Option<ChannelUpdateInfo>,
pub node_two: NodeId,
pub two_to_one: Option<ChannelUpdateInfo>,
pub capacity_sats: Option<u64>,
}
#[cfg(feature = "uniffi")]
impl From<lightning::routing::gossip::ChannelInfo> for ChannelInfo {
fn from(value: lightning::routing::gossip::ChannelInfo) -> Self {
Self {
node_one: value.node_one,
one_to_two: value.one_to_two.map(|u| u.into()),
node_two: value.node_two,
two_to_one: value.two_to_one.map(|u| u.into()),
capacity_sats: value.capacity_sats,
}
}
}
#[cfg(feature = "uniffi")]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ChannelUpdateInfo {
pub last_update: u32,
pub enabled: bool,
pub cltv_expiry_delta: u16,
pub htlc_minimum_msat: u64,
pub htlc_maximum_msat: u64,
pub fees: RoutingFees,
}
#[cfg(feature = "uniffi")]
impl From<lightning::routing::gossip::ChannelUpdateInfo> for ChannelUpdateInfo {
fn from(value: lightning::routing::gossip::ChannelUpdateInfo) -> Self {
Self {
last_update: value.last_update,
enabled: value.enabled,
cltv_expiry_delta: value.cltv_expiry_delta,
htlc_minimum_msat: value.htlc_minimum_msat,
htlc_maximum_msat: value.htlc_maximum_msat,
fees: value.fees,
}
}
}
#[cfg(feature = "uniffi")]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct NodeInfo {
pub channels: Vec<u64>,
pub announcement_info: Option<NodeAnnouncementInfo>,
}
#[cfg(feature = "uniffi")]
impl From<lightning::routing::gossip::NodeInfo> for NodeInfo {
fn from(value: lightning::routing::gossip::NodeInfo) -> Self {
Self {
channels: value.channels,
announcement_info: value.announcement_info.map(|a| a.into()),
}
}
}
#[cfg(feature = "uniffi")]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct NodeAnnouncementInfo {
pub last_update: u32,
pub alias: String,
pub addresses: Vec<SocketAddress>,
}
#[cfg(feature = "uniffi")]
impl From<lightning::routing::gossip::NodeAnnouncementInfo> for NodeAnnouncementInfo {
fn from(value: lightning::routing::gossip::NodeAnnouncementInfo) -> Self {
Self {
last_update: value.last_update(),
alias: value.alias().to_string(),
addresses: value.addresses().iter().cloned().collect(),
}
}
}