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