1use super::*;
2
3#[derive(Debug, Error)]
5pub enum NodeError {
6 #[error("node not started")]
7 NotStarted,
8
9 #[error("node already started")]
10 AlreadyStarted,
11
12 #[error("node already stopped")]
13 AlreadyStopped,
14
15 #[error("transport not found: {0}")]
16 TransportNotFound(TransportId),
17
18 #[error("no transport available for type: {0}")]
19 NoTransportForType(String),
20
21 #[error("link not found: {0}")]
22 LinkNotFound(LinkId),
23
24 #[error("connection not found: {0}")]
25 ConnectionNotFound(LinkId),
26
27 #[error("peer not found: {0:?}")]
28 PeerNotFound(NodeAddr),
29
30 #[error("peer already exists: {0:?}")]
31 PeerAlreadyExists(NodeAddr),
32
33 #[error("connection already exists for link: {0}")]
34 ConnectionAlreadyExists(LinkId),
35
36 #[error("invalid peer npub '{npub}': {reason}")]
37 InvalidPeerNpub { npub: String, reason: String },
38
39 #[error("discovery error: {0}")]
40 Discovery(String),
41
42 #[error("access denied: {0}")]
43 AccessDenied(String),
44
45 #[error("max connections exceeded: {max}")]
46 MaxConnectionsExceeded { max: usize },
47
48 #[error("max peers exceeded: {max}")]
49 MaxPeersExceeded { max: usize },
50
51 #[error("max links exceeded: {max}")]
52 MaxLinksExceeded { max: usize },
53
54 #[error("handshake incomplete for link {0}")]
55 HandshakeIncomplete(LinkId),
56
57 #[error("no session available for link {0}")]
58 NoSession(LinkId),
59
60 #[error("promotion failed for link {link_id}: {reason}")]
61 PromotionFailed { link_id: LinkId, reason: String },
62
63 #[error("send failed to {node_addr}: {reason}")]
64 SendFailed { node_addr: NodeAddr, reason: String },
65
66 #[error("mtu exceeded forwarding to {node_addr}: packet {packet_size} > mtu {mtu}")]
67 MtuExceeded {
68 node_addr: NodeAddr,
69 packet_size: usize,
70 mtu: u16,
71 },
72
73 #[error("config error: {0}")]
74 Config(#[from] ConfigError),
75
76 #[error("identity error: {0}")]
77 Identity(#[from] IdentityError),
78
79 #[error("TUN error: {0}")]
80 Tun(#[from] TunError),
81
82 #[error("index allocation failed: {0}")]
83 IndexAllocationFailed(String),
84
85 #[error("handshake failed: {0}")]
86 HandshakeFailed(String),
87
88 #[error("transport error: {0}")]
89 TransportError(String),
90
91 #[error("local route unavailable: {0}")]
92 LocalRouteUnavailable(String),
93
94 #[error("bootstrap handoff failed: {0}")]
95 BootstrapHandoff(String),
96}
97
98impl NodeError {
99 pub(in crate::node) fn from_transport_error(error: TransportError) -> Self {
100 if error.is_local_route_unavailable() {
101 Self::LocalRouteUnavailable(error.to_string())
102 } else {
103 Self::TransportError(error.to_string())
104 }
105 }
106
107 pub(in crate::node) fn is_local_route_unavailable(&self) -> bool {
108 matches!(self, Self::LocalRouteUnavailable(_))
109 }
110}