Skip to main content

nym_node_requests/
lib.rs

1// Copyright 2023 - Nym Technologies SA <contact@nymtech.net>
2// SPDX-License-Identifier: Apache-2.0
3
4#![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
17// still thinking how to nicely organise it
18pub 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            // define helper functions to get absolute routes
52            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                // use super::*;
121            }
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                // use super::*;
137            }
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                // use super::*;
152            }
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}