use crate::{Flag, OptionalDuration, OptionalInteger, OptionalString, Priority};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct SwarmConfig {
#[serde(default)]
pub addr_filters: Vec<String>,
#[serde(default)]
pub disable_bandwidth_metrics: bool,
#[serde(default)]
pub disable_nat_port_map: bool,
#[serde(default)]
pub relay_client: RelayClient,
#[serde(default)]
pub relay_service: RelayService,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enable_hole_punching: Option<Flag>,
#[serde(default)]
pub transports: Transports,
#[serde(default)]
pub conn_mgr: ConnMgr,
#[serde(default)]
pub resource_mgr: ResourceMgr,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct RelayClient {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enabled: Option<Flag>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub static_relays: Option<Vec<String>>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct RelayService {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enabled: Option<Flag>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub connection_duration_limit: Option<OptionalDuration>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub connection_data_limit: Option<OptionalInteger>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "ReservationTTL"
)]
pub reservation_ttl: Option<OptionalDuration>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_reservations: Option<OptionalInteger>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_circuits: Option<OptionalInteger>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub buffer_size: Option<OptionalInteger>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "MaxReservationsPerIP"
)]
pub max_reservations_per_ip: Option<OptionalInteger>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "MaxReservationsPerASN"
)]
pub max_reservations_per_asn: Option<OptionalInteger>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Transports {
#[serde(default)]
pub network: NetworkTransports,
#[serde(default)]
pub security: SecurityTransports,
#[serde(default)]
pub multiplexers: MultiplexerTransports,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct NetworkTransports {
#[serde(default, skip_serializing_if = "Option::is_none", rename = "QUIC")]
pub quic: Option<Flag>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "TCP")]
pub tcp: Option<Flag>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub websocket: Option<Flag>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub relay: Option<Flag>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub web_transport: Option<Flag>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
rename = "WebRTCDirect"
)]
pub web_rtc_direct: Option<Flag>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct SecurityTransports {
#[serde(default, skip_serializing_if = "Option::is_none", rename = "TLS")]
pub tls: Option<Priority>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub noise: Option<Priority>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct MultiplexerTransports {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub yamux: Option<Priority>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct ConnMgr {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub r#type: Option<OptionalString>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub low_water: Option<OptionalInteger>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub high_water: Option<OptionalInteger>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub grace_period: Option<OptionalDuration>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub silence_period: Option<OptionalDuration>,
}
impl ConnMgr {
pub const DEFAULT_LOW_WATER: i64 = 32;
pub const DEFAULT_HIGH_WATER: i64 = 96;
pub const DEFAULT_GRACE_PERIOD: &'static str = "1m";
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct ResourceMgr {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enabled: Option<Flag>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_memory: Option<OptionalString>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_file_descriptors: Option<OptionalInteger>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub allowlist: Option<Vec<String>>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_swarm_config_default() {
let swarm = SwarmConfig::default();
assert!(!swarm.disable_bandwidth_metrics);
assert!(!swarm.disable_nat_port_map);
}
#[test]
fn test_conn_mgr_defaults() {
assert_eq!(ConnMgr::DEFAULT_LOW_WATER, 32);
assert_eq!(ConnMgr::DEFAULT_HIGH_WATER, 96);
}
}