1use std::sync::Arc;
11
12#[cfg(feature = "uniffi")]
13use lightning::ln::msgs::SocketAddress;
14use lightning::routing::gossip::NodeId;
15#[cfg(feature = "uniffi")]
16use lightning::routing::gossip::RoutingFees;
17#[cfg(not(feature = "uniffi"))]
18use lightning::routing::gossip::{ChannelInfo, NodeInfo};
19
20use crate::types::Graph;
21
22pub struct NetworkGraph {
24 inner: Arc<Graph>,
25}
26
27impl NetworkGraph {
28 pub(crate) fn new(inner: Arc<Graph>) -> Self {
29 Self { inner }
30 }
31
32 pub fn list_channels(&self) -> Vec<u64> {
34 self.inner.read_only().channels().unordered_keys().map(|c| *c).collect()
35 }
36
37 pub fn channel(&self, short_channel_id: u64) -> Option<ChannelInfo> {
39 self.inner.read_only().channels().get(&short_channel_id).cloned().map(|c| c.into())
40 }
41
42 pub fn list_nodes(&self) -> Vec<NodeId> {
44 self.inner.read_only().nodes().unordered_keys().map(|n| *n).collect()
45 }
46
47 pub fn node(&self, node_id: &NodeId) -> Option<NodeInfo> {
49 self.inner.read_only().nodes().get(node_id).cloned().map(|n| n.into())
50 }
51}
52
53#[cfg(feature = "uniffi")]
59#[derive(Clone, Debug, PartialEq, Eq)]
60pub struct ChannelInfo {
61 pub node_one: NodeId,
63 pub one_to_two: Option<ChannelUpdateInfo>,
65 pub node_two: NodeId,
67 pub two_to_one: Option<ChannelUpdateInfo>,
69 pub capacity_sats: Option<u64>,
71}
72
73#[cfg(feature = "uniffi")]
74impl From<lightning::routing::gossip::ChannelInfo> for ChannelInfo {
75 fn from(value: lightning::routing::gossip::ChannelInfo) -> Self {
76 Self {
77 node_one: value.node_one,
78 one_to_two: value.one_to_two.map(|u| u.into()),
79 node_two: value.node_two,
80 two_to_one: value.two_to_one.map(|u| u.into()),
81 capacity_sats: value.capacity_sats,
82 }
83 }
84}
85
86#[cfg(feature = "uniffi")]
90#[derive(Clone, Debug, PartialEq, Eq)]
91pub struct ChannelUpdateInfo {
92 pub last_update: u32,
95 pub enabled: bool,
97 pub cltv_expiry_delta: u16,
99 pub htlc_minimum_msat: u64,
101 pub htlc_maximum_msat: u64,
103 pub fees: RoutingFees,
105}
106
107#[cfg(feature = "uniffi")]
108impl From<lightning::routing::gossip::ChannelUpdateInfo> for ChannelUpdateInfo {
109 fn from(value: lightning::routing::gossip::ChannelUpdateInfo) -> Self {
110 Self {
111 last_update: value.last_update,
112 enabled: value.enabled,
113 cltv_expiry_delta: value.cltv_expiry_delta,
114 htlc_minimum_msat: value.htlc_minimum_msat,
115 htlc_maximum_msat: value.htlc_maximum_msat,
116 fees: value.fees,
117 }
118 }
119}
120
121#[cfg(feature = "uniffi")]
125#[derive(Clone, Debug, PartialEq, Eq)]
126pub struct NodeInfo {
127 pub channels: Vec<u64>,
129 pub announcement_info: Option<NodeAnnouncementInfo>,
133}
134
135#[cfg(feature = "uniffi")]
136impl From<lightning::routing::gossip::NodeInfo> for NodeInfo {
137 fn from(value: lightning::routing::gossip::NodeInfo) -> Self {
138 Self {
139 channels: value.channels,
140 announcement_info: value.announcement_info.map(|a| a.into()),
141 }
142 }
143}
144
145#[cfg(feature = "uniffi")]
149#[derive(Clone, Debug, PartialEq, Eq)]
150pub struct NodeAnnouncementInfo {
151 pub last_update: u32,
154 pub alias: String,
158 pub addresses: Vec<SocketAddress>,
160}
161
162#[cfg(feature = "uniffi")]
163impl From<lightning::routing::gossip::NodeAnnouncementInfo> for NodeAnnouncementInfo {
164 fn from(value: lightning::routing::gossip::NodeAnnouncementInfo) -> Self {
165 Self {
166 last_update: value.last_update(),
167 alias: value.alias().to_string(),
168 addresses: value.addresses().iter().cloned().collect(),
169 }
170 }
171}