use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TcpListenerConfig {
pub port: u16,
#[serde(default)]
pub protocol_hint: Option<String>,
#[serde(default)]
pub tls: bool,
#[serde(default)]
pub proxy_protocol: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UdpListenerConfig {
pub port: u16,
#[serde(default)]
pub protocol_hint: Option<String>,
#[serde(default, with = "optional_duration_serde")]
pub session_timeout: Option<Duration>,
}
pub const DEFAULT_UDP_SESSION_TIMEOUT: Duration = Duration::from_secs(60);
mod optional_duration_serde {
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::time::Duration;
#[allow(clippy::ref_option)]
pub fn serialize<S>(value: &Option<Duration>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match value {
Some(d) => d.as_secs().serialize(serializer),
None => serializer.serialize_none(),
}
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<Duration>, D::Error>
where
D: Deserializer<'de>,
{
let opt: Option<u64> = Option::deserialize(deserializer)?;
Ok(opt.map(Duration::from_secs))
}
}