1pub mod api;
5pub mod error;
6
7#[cfg(feature = "client")]
8pub use crate::api::helpers::try_get_valid_nym_node_api_client;
9
10macro_rules! absolute_route {
11 ( $name:ident, $parent:expr, $suffix:expr ) => {
12 pub fn $name() -> String {
13 format!("{}{}", $parent, $suffix)
14 }
15 };
16}
17
18pub mod routes {
20 pub const LANDING_PAGE: &str = "/";
21 pub const ROOT: &str = "/";
22 pub const API: &str = "/api";
23
24 pub mod api {
25 pub const V1: &str = "/v1";
26 pub const V2: &str = "/v2";
27
28 pub const SWAGGER: &str = "/swagger";
30
31 absolute_route!(v1_absolute, super::API, V1);
32 absolute_route!(v2_absolute, super::API, V2);
33 absolute_route!(swagger_absolute, super::API, SWAGGER);
34
35 pub mod v1 {
36 use super::*;
37
38 pub const ROLES: &str = "/roles";
39 pub const BUILD_INFO: &str = "/build-information";
40 pub const HOST_INFO: &str = "/host-information";
41 pub const SYSTEM_INFO: &str = "/system-info";
42 pub const NODE_DESCRIPTION: &str = "/description";
43 pub const AUXILIARY: &str = "/auxiliary-details";
44 pub const HEALTH: &str = "/health";
45 pub const LOAD: &str = "/load";
46 pub const NETWORK: &str = "/network";
47 pub const SWAGGER: &str = "/swagger";
48
49 pub const GATEWAY: &str = "/gateway";
50 pub const MIXNODE: &str = "/mixnode";
51 pub const METRICS: &str = "/metrics";
52 pub const BRIDGES: &str = "/bridges";
53 pub const NETWORK_REQUESTER: &str = "/network-requester";
54 pub const IP_PACKET_ROUTER: &str = "/ip-packet-router";
55 pub const AUTHENTICATOR: &str = "/authenticator";
56 pub const LEWES_PROTOCOL: &str = "/lewes-protocol";
57
58 absolute_route!(health_absolute, v1_absolute(), HEALTH);
60 absolute_route!(load_absolute, v1_absolute(), LOAD);
61 absolute_route!(network_absolute, v1_absolute(), NETWORK);
62 absolute_route!(roles_absolute, v1_absolute(), ROLES);
63 absolute_route!(build_info_absolute, v1_absolute(), BUILD_INFO);
64 absolute_route!(host_info_absolute, v1_absolute(), HOST_INFO);
65 absolute_route!(system_info_absolute, v1_absolute(), SYSTEM_INFO);
66 absolute_route!(description_absolute, v1_absolute(), NODE_DESCRIPTION);
67 absolute_route!(auxiliary_absolute, v1_absolute(), AUXILIARY);
68
69 absolute_route!(gateway_absolute, v1_absolute(), GATEWAY);
70 absolute_route!(mixnode_absolute, v1_absolute(), MIXNODE);
71 absolute_route!(metrics_absolute, v1_absolute(), METRICS);
72 absolute_route!(network_requester_absolute, v1_absolute(), NETWORK_REQUESTER);
73 absolute_route!(ip_packet_router_absolute, v1_absolute(), IP_PACKET_ROUTER);
74 absolute_route!(authenticator_absolute, v1_absolute(), AUTHENTICATOR);
75 absolute_route!(lp_absolute, v1_absolute(), LEWES_PROTOCOL);
76 absolute_route!(swagger_absolute, v1_absolute(), SWAGGER);
77
78 pub mod metrics {
79 use super::*;
80
81 pub const LEGACY_MIXING: &str = "/mixing";
82 pub const PACKETS_STATS: &str = "/packets-stats";
83 pub const WIREGUARD_STATS: &str = "/wireguard-stats";
84 pub const SESSIONS: &str = "/sessions";
85 pub const VERLOC: &str = "/verloc";
86 pub const PROMETHEUS: &str = "/prometheus";
87
88 absolute_route!(legacy_mixing_absolute, metrics_absolute(), LEGACY_MIXING);
89 absolute_route!(packets_stats_absolute, metrics_absolute(), PACKETS_STATS);
90 absolute_route!(
91 wireguard_stats_absolute,
92 metrics_absolute(),
93 WIREGUARD_STATS
94 );
95 absolute_route!(sessions_absolute, metrics_absolute(), SESSIONS);
96 absolute_route!(verloc_absolute, metrics_absolute(), VERLOC);
97 absolute_route!(prometheus_absolute, metrics_absolute(), PROMETHEUS);
98 }
99
100 pub mod gateway {
101 use super::*;
102
103 pub const CLIENT_INTERFACES: &str = "/client-interfaces";
104
105 absolute_route!(
106 client_interfaces_absolute,
107 gateway_absolute(),
108 CLIENT_INTERFACES
109 );
110
111 pub mod client_interfaces {
112 use super::*;
113
114 pub const WIREGUARD: &str = "/wireguard";
115 pub const WEBSOCKETS: &str = "/mixnet-websockets";
116
117 absolute_route!(wireguard_absolute, client_interfaces_absolute(), WIREGUARD);
118 absolute_route!(
119 mixnet_websockets_absolute,
120 client_interfaces_absolute(),
121 WEBSOCKETS
122 );
123 }
124 }
125
126 pub mod mixnode {
127 }
129
130 pub mod network_requester {
131 use super::*;
132
133 pub const EXIT_POLICY: &str = "/exit-policy";
134
135 absolute_route!(
136 exit_policy_absolute,
137 network_requester_absolute(),
138 EXIT_POLICY
139 );
140 }
141
142 pub mod ip_packet_router {
143 }
145
146 pub mod network {
147 use super::*;
148 pub const UPGRADE_MODE_STATUS: &str = "/upgrade-mode-status";
149
150 absolute_route!(
151 upgrade_mode_status_absolute,
152 network_absolute(),
153 UPGRADE_MODE_STATUS
154 );
155 }
156
157 pub mod lewes_protocol {
158 }
160 }
161
162 pub mod v2 {
163 use super::*;
164
165 pub const AUXILIARY: &str = "/auxiliary-details";
166
167 absolute_route!(auxiliary_absolute, v2_absolute(), AUXILIARY);
168 }
169 }
170}
171
172#[cfg(test)]
173mod tests {
174 use super::*;
175
176 #[test]
177 fn route_expansion_works() {
178 assert_eq!("/api/v1", routes::api::v1_absolute());
179
180 assert_eq!(
181 "/api/v1/build-information",
182 routes::api::v1::build_info_absolute()
183 );
184 assert_eq!(
185 "/api/v1/host-information",
186 routes::api::v1::host_info_absolute()
187 );
188 assert_eq!("/api/v1/roles", routes::api::v1::roles_absolute());
189
190 assert_eq!("/api/v1/gateway", routes::api::v1::gateway_absolute());
191 assert_eq!(
192 "/api/v1/gateway/client-interfaces",
193 routes::api::v1::gateway::client_interfaces_absolute()
194 );
195 assert_eq!(
196 "/api/v1/gateway/client-interfaces/wireguard",
197 routes::api::v1::gateway::client_interfaces::wireguard_absolute()
198 );
199 assert_eq!(
200 "/api/v1/gateway/client-interfaces/mixnet-websockets",
201 routes::api::v1::gateway::client_interfaces::mixnet_websockets_absolute()
202 );
203
204 assert_eq!("/api/v1/mixnode", routes::api::v1::mixnode_absolute());
205 assert_eq!(
206 "/api/v1/network-requester",
207 routes::api::v1::network_requester_absolute()
208 );
209 assert_eq!(
210 "/api/v1/ip-packet-router",
211 routes::api::v1::ip_packet_router_absolute()
212 );
213 }
214}