Skip to main content

fips_core/node/
error.rs

1use super::*;
2
3/// Errors related to node operations.
4#[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}