use std::time::Duration;
use tap::Pipe;
#[derive(Debug, Clone, clap::Args, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
#[group(id = "valkey.connection.tcp.keepalive")]
#[remain::sorted]
#[rustfmt::skip]
pub(crate) struct TcpKeepalive {
#[arg(
env = "VALKEY_CONNECTION_TCP_KEEPALIVE_INTERVAL",
long = "valkey-connection-tcp-keepalive-interval",
id = "valkey.connection.tcp.keepalive.interval",
value_name = "DURATION",
value_parser = crate::parse::duration,
help_heading = "Valkey Options",
help = "Sets the time interval between TCP keepalive probes.",
)]
pub(crate) interval: Option<Duration>,
#[arg(
env = "VALKEY_CONNECTION_TCP_KEEPALIVE_RETRIES",
long = "valkey-connection-tcp-keepalive-retries",
id = "valkey.connection.tcp.keepalive.retries",
value_name = "U32",
help_heading = "Valkey Options",
help = "Set the maximum number of TCP keepalive probes that will be sent before dropping a connection."
)]
pub(crate) retries: Option<u32>,
#[arg(
env = "VALKEY_CONNECTION_TCP_KEEPALIVE_TIME",
long = "valkey-connection-tcp-keepalive-time",
id = "valkey.connection.tcp.keepalive.time",
value_name = "DURATION",
value_parser = crate::parse::duration,
help_heading = "Valkey Options",
help = "Set the amount of time after which TCP keepalive probes will be sent on idle connections."
)]
pub(crate) time: Option<Duration>,
}
impl From<TcpKeepalive> for socket2::TcpKeepalive {
fn from(value: TcpKeepalive) -> Self {
let TcpKeepalive {
interval,
retries,
time,
} = value;
Self::new()
.pipe(|this| match interval {
Some(interval) => this.with_interval(interval),
None => this,
})
.pipe(|this| match retries {
Some(retries) => this.with_retries(retries),
None => this,
})
.pipe(|this| match time {
Some(time) => this.with_time(time),
None => this,
})
}
}