nym-node-requests 1.21.5-rc.2

Nym Node API endpoint definitions and functions
Documentation
// Copyright 2023 - Nym Technologies SA <contact@nymtech.net>
// SPDX-License-Identifier: Apache-2.0

pub mod api;
pub mod error;

#[cfg(feature = "client")]
pub use crate::api::helpers::try_get_valid_nym_node_api_client;

macro_rules! absolute_route {
    ( $name:ident, $parent:expr, $suffix:expr ) => {
        pub fn $name() -> String {
            format!("{}{}", $parent, $suffix)
        }
    };
}

// still thinking how to nicely organise it
pub mod routes {
    pub const LANDING_PAGE: &str = "/";
    pub const ROOT: &str = "/";
    pub const API: &str = "/api";

    pub mod api {
        pub const V1: &str = "/v1";
        pub const V2: &str = "/v2";

        // canonical, version-neutral Swagger UI mount
        pub const SWAGGER: &str = "/swagger";

        absolute_route!(v1_absolute, super::API, V1);
        absolute_route!(v2_absolute, super::API, V2);
        absolute_route!(swagger_absolute, super::API, SWAGGER);

        pub mod v1 {
            use super::*;

            pub const ROLES: &str = "/roles";
            pub const BUILD_INFO: &str = "/build-information";
            pub const HOST_INFO: &str = "/host-information";
            pub const SYSTEM_INFO: &str = "/system-info";
            pub const NODE_DESCRIPTION: &str = "/description";
            pub const AUXILIARY: &str = "/auxiliary-details";
            pub const HEALTH: &str = "/health";
            pub const LOAD: &str = "/load";
            pub const NETWORK: &str = "/network";
            pub const SWAGGER: &str = "/swagger";

            pub const GATEWAY: &str = "/gateway";
            pub const MIXNODE: &str = "/mixnode";
            pub const METRICS: &str = "/metrics";
            pub const BRIDGES: &str = "/bridges";
            pub const NETWORK_REQUESTER: &str = "/network-requester";
            pub const IP_PACKET_ROUTER: &str = "/ip-packet-router";
            pub const AUTHENTICATOR: &str = "/authenticator";
            pub const LEWES_PROTOCOL: &str = "/lewes-protocol";

            // define helper functions to get absolute routes
            absolute_route!(health_absolute, v1_absolute(), HEALTH);
            absolute_route!(load_absolute, v1_absolute(), LOAD);
            absolute_route!(network_absolute, v1_absolute(), NETWORK);
            absolute_route!(roles_absolute, v1_absolute(), ROLES);
            absolute_route!(build_info_absolute, v1_absolute(), BUILD_INFO);
            absolute_route!(host_info_absolute, v1_absolute(), HOST_INFO);
            absolute_route!(system_info_absolute, v1_absolute(), SYSTEM_INFO);
            absolute_route!(description_absolute, v1_absolute(), NODE_DESCRIPTION);
            absolute_route!(auxiliary_absolute, v1_absolute(), AUXILIARY);

            absolute_route!(gateway_absolute, v1_absolute(), GATEWAY);
            absolute_route!(mixnode_absolute, v1_absolute(), MIXNODE);
            absolute_route!(metrics_absolute, v1_absolute(), METRICS);
            absolute_route!(network_requester_absolute, v1_absolute(), NETWORK_REQUESTER);
            absolute_route!(ip_packet_router_absolute, v1_absolute(), IP_PACKET_ROUTER);
            absolute_route!(authenticator_absolute, v1_absolute(), AUTHENTICATOR);
            absolute_route!(lp_absolute, v1_absolute(), LEWES_PROTOCOL);
            absolute_route!(swagger_absolute, v1_absolute(), SWAGGER);

            pub mod metrics {
                use super::*;

                pub const LEGACY_MIXING: &str = "/mixing";
                pub const PACKETS_STATS: &str = "/packets-stats";
                pub const WIREGUARD_STATS: &str = "/wireguard-stats";
                pub const SESSIONS: &str = "/sessions";
                pub const VERLOC: &str = "/verloc";
                pub const PROMETHEUS: &str = "/prometheus";

                absolute_route!(legacy_mixing_absolute, metrics_absolute(), LEGACY_MIXING);
                absolute_route!(packets_stats_absolute, metrics_absolute(), PACKETS_STATS);
                absolute_route!(
                    wireguard_stats_absolute,
                    metrics_absolute(),
                    WIREGUARD_STATS
                );
                absolute_route!(sessions_absolute, metrics_absolute(), SESSIONS);
                absolute_route!(verloc_absolute, metrics_absolute(), VERLOC);
                absolute_route!(prometheus_absolute, metrics_absolute(), PROMETHEUS);
            }

            pub mod gateway {
                use super::*;

                pub const CLIENT_INTERFACES: &str = "/client-interfaces";

                absolute_route!(
                    client_interfaces_absolute,
                    gateway_absolute(),
                    CLIENT_INTERFACES
                );

                pub mod client_interfaces {
                    use super::*;

                    pub const WIREGUARD: &str = "/wireguard";
                    pub const WEBSOCKETS: &str = "/mixnet-websockets";

                    absolute_route!(wireguard_absolute, client_interfaces_absolute(), WIREGUARD);
                    absolute_route!(
                        mixnet_websockets_absolute,
                        client_interfaces_absolute(),
                        WEBSOCKETS
                    );
                }
            }

            pub mod mixnode {
                // use super::*;
            }

            pub mod network_requester {
                use super::*;

                pub const EXIT_POLICY: &str = "/exit-policy";

                absolute_route!(
                    exit_policy_absolute,
                    network_requester_absolute(),
                    EXIT_POLICY
                );
            }

            pub mod ip_packet_router {
                // use super::*;
            }

            pub mod network {
                use super::*;
                pub const UPGRADE_MODE_STATUS: &str = "/upgrade-mode-status";

                absolute_route!(
                    upgrade_mode_status_absolute,
                    network_absolute(),
                    UPGRADE_MODE_STATUS
                );
            }

            pub mod lewes_protocol {
                // use super::*;
            }
        }

        pub mod v2 {
            use super::*;

            pub const AUXILIARY: &str = "/auxiliary-details";

            absolute_route!(auxiliary_absolute, v2_absolute(), AUXILIARY);
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn route_expansion_works() {
        assert_eq!("/api/v1", routes::api::v1_absolute());

        assert_eq!(
            "/api/v1/build-information",
            routes::api::v1::build_info_absolute()
        );
        assert_eq!(
            "/api/v1/host-information",
            routes::api::v1::host_info_absolute()
        );
        assert_eq!("/api/v1/roles", routes::api::v1::roles_absolute());

        assert_eq!("/api/v1/gateway", routes::api::v1::gateway_absolute());
        assert_eq!(
            "/api/v1/gateway/client-interfaces",
            routes::api::v1::gateway::client_interfaces_absolute()
        );
        assert_eq!(
            "/api/v1/gateway/client-interfaces/wireguard",
            routes::api::v1::gateway::client_interfaces::wireguard_absolute()
        );
        assert_eq!(
            "/api/v1/gateway/client-interfaces/mixnet-websockets",
            routes::api::v1::gateway::client_interfaces::mixnet_websockets_absolute()
        );

        assert_eq!("/api/v1/mixnode", routes::api::v1::mixnode_absolute());
        assert_eq!(
            "/api/v1/network-requester",
            routes::api::v1::network_requester_absolute()
        );
        assert_eq!(
            "/api/v1/ip-packet-router",
            routes::api::v1::ip_packet_router_absolute()
        );
    }
}