skytool 0.1.0-pre.2

an experimental API client for BlueSky / ATProto
Documentation
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,
      })
  }
}