Skip to main content

netray_common/
ecosystem.rs

1//! Ecosystem service URL configuration shared across netray.info services.
2
3/// Public-facing URLs for the services in the netray.info ecosystem.
4///
5/// These URLs are served to browser frontends (via `/api/meta` or `/meta`)
6/// for cross-tool navigation. They go through Traefik and are subject to
7/// public rate limits. Fields set to `None` are omitted from serialization.
8#[derive(Debug, Clone, Default, serde::Deserialize, serde::Serialize)]
9#[cfg_attr(feature = "schema", derive(utoipa::ToSchema))]
10pub struct EcosystemConfig {
11    /// Public base URL of the IP enrichment service (ip.netray.info).
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub ip_base_url: Option<String>,
14    /// Public base URL of the DNS inspector service (dns.netray.info).
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub dns_base_url: Option<String>,
17    /// Public base URL of the TLS inspector service (tls.netray.info).
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub tls_base_url: Option<String>,
20    /// Public base URL of the HTTP inspector service (http.netray.info).
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub http_base_url: Option<String>,
23    /// Public base URL of the email inspector service (email.netray.info).
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub email_base_url: Option<String>,
26    /// Public base URL of the unified health checker (lens.netray.info).
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub lens_base_url: Option<String>,
29}
30
31impl EcosystemConfig {
32    /// Returns `true` if at least one URL is configured.
33    pub fn has_any(&self) -> bool {
34        self.ip_base_url.is_some()
35            || self.dns_base_url.is_some()
36            || self.tls_base_url.is_some()
37            || self.http_base_url.is_some()
38            || self.email_base_url.is_some()
39            || self.lens_base_url.is_some()
40    }
41}