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}