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