use std::time::Duration;
use crate::Socket;
#[derive(Default, Debug, Copy, Clone)]
pub struct SocketOpts {
recv_buffer_size: Option<usize>,
send_buffer_size: Option<usize>,
keepalive: Option<bool>,
linger: Option<Duration>,
read_timeout: Option<Duration>,
write_timeout: Option<Duration>,
reuse_address: Option<bool>,
reuse_port: Option<bool>,
nodelay: Option<bool>,
}
impl SocketOpts {
pub fn new() -> Self {
Self::default()
}
pub fn recv_buffer_size(mut self, size: usize) -> Self {
self.recv_buffer_size = Some(size);
self
}
pub fn send_buffer_size(mut self, size: usize) -> Self {
self.send_buffer_size = Some(size);
self
}
pub fn keepalive(mut self, keepalive: bool) -> Self {
self.keepalive = Some(keepalive);
self
}
pub fn linger(mut self, duration: Duration) -> Self {
self.linger = Some(duration);
self
}
pub fn read_timeout(mut self, duration: Duration) -> Self {
self.read_timeout = Some(duration);
self
}
pub fn write_timeout(mut self, duration: Duration) -> Self {
self.write_timeout = Some(duration);
self
}
pub fn reuse_address(mut self, reuse: bool) -> Self {
self.reuse_address = Some(reuse);
self
}
pub fn reuse_port(mut self, reuse: bool) -> Self {
self.reuse_port = Some(reuse);
self
}
pub fn nodelay(mut self, nodelay: bool) -> Self {
self.nodelay = Some(nodelay);
self
}
pub(crate) fn setup_socket(&self, socket: &Socket) -> std::io::Result<()> {
if let Some(size) = self.recv_buffer_size {
socket.socket.set_recv_buffer_size(size)?;
}
if let Some(size) = self.send_buffer_size {
socket.socket.set_send_buffer_size(size)?;
}
if let Some(keepalive) = self.keepalive {
socket.socket.set_keepalive(keepalive)?;
}
if let Some(linger) = self.linger {
socket.socket.set_linger(Some(linger))?;
}
if let Some(read_timeout) = self.read_timeout {
socket.socket.set_read_timeout(Some(read_timeout))?;
}
if let Some(write_timeout) = self.write_timeout {
socket.socket.set_write_timeout(Some(write_timeout))?;
}
if let Some(reuse_address) = self.reuse_address {
socket.socket.set_reuse_address(reuse_address)?;
}
#[cfg(all(
unix,
not(any(target_os = "illumos", target_os = "solaris", target_os = "cygwin"))
))]
if let Some(reuse_port) = self.reuse_port {
socket.socket.set_reuse_port(reuse_port)?;
}
if let Some(nodelay) = self.nodelay {
socket.socket.set_tcp_nodelay(nodelay)?;
}
Ok(())
}
}