Skip to main content

leyline/core/config/
socket.rs

1use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
2use std::time::Duration;
3
4use crate::tls::HappyEyeballsConfig;
5
6#[derive(Debug, Clone, PartialEq, Eq)]
7#[non_exhaustive]
8pub struct SocketConfig {
9    pub(crate) local_address: Option<IpAddr>,
10    pub(crate) local_ipv4: Option<Ipv4Addr>,
11    pub(crate) local_ipv6: Option<Ipv6Addr>,
12    pub(crate) tcp_nodelay: Option<bool>,
13    pub(crate) tcp_keepalive: Option<Duration>,
14    pub(crate) tcp_keepalive_interval: Option<Duration>,
15    pub(crate) tcp_keepalive_retries: Option<u32>,
16    pub(crate) tcp_user_timeout: Option<Duration>,
17    pub(crate) send_buffer_size: Option<usize>,
18    pub(crate) recv_buffer_size: Option<usize>,
19    pub(crate) strict: bool,
20    pub(crate) happy_eyeballs: Option<HappyEyeballsConfig>,
21}
22
23impl Default for SocketConfig {
24    fn default() -> Self {
25        Self {
26            local_address: None,
27            local_ipv4: None,
28            local_ipv6: None,
29            tcp_nodelay: None,
30            tcp_keepalive: Some(Duration::from_secs(60)),
31            tcp_keepalive_interval: Some(Duration::from_secs(30)),
32            tcp_keepalive_retries: Some(3),
33            tcp_user_timeout: None,
34            send_buffer_size: None,
35            recv_buffer_size: None,
36            strict: false,
37            happy_eyeballs: None,
38        }
39    }
40}
41
42impl SocketConfig {
43    pub fn new() -> Self {
44        Self::default()
45    }
46
47    pub fn local_address(mut self, addr: impl Into<Option<IpAddr>>) -> Self {
48        self.local_address = addr.into();
49        self
50    }
51
52    pub fn local_ipv4(mut self, addr: impl Into<Option<Ipv4Addr>>) -> Self {
53        self.local_ipv4 = addr.into();
54        self
55    }
56
57    pub fn local_ipv6(mut self, addr: impl Into<Option<Ipv6Addr>>) -> Self {
58        self.local_ipv6 = addr.into();
59        self
60    }
61
62    pub fn tcp_nodelay(mut self, on: impl Into<Option<bool>>) -> Self {
63        self.tcp_nodelay = on.into();
64        self
65    }
66
67    pub fn tcp_keepalive(mut self, d: impl Into<Option<Duration>>) -> Self {
68        self.tcp_keepalive = d.into();
69        self
70    }
71
72    pub fn tcp_keepalive_interval(mut self, d: impl Into<Option<Duration>>) -> Self {
73        self.tcp_keepalive_interval = d.into();
74        self
75    }
76
77    pub fn tcp_keepalive_retries(mut self, n: impl Into<Option<u32>>) -> Self {
78        self.tcp_keepalive_retries = n.into();
79        self
80    }
81
82    pub fn tcp_user_timeout(mut self, d: impl Into<Option<Duration>>) -> Self {
83        self.tcp_user_timeout = d.into();
84        self
85    }
86
87    pub fn send_buffer_size(mut self, n: impl Into<Option<usize>>) -> Self {
88        self.send_buffer_size = n.into();
89        self
90    }
91
92    pub fn recv_buffer_size(mut self, n: impl Into<Option<usize>>) -> Self {
93        self.recv_buffer_size = n.into();
94        self
95    }
96
97    pub fn strict(mut self, on: bool) -> Self {
98        self.strict = on;
99        self
100    }
101
102    pub fn happy_eyeballs(mut self, config: impl Into<Option<HappyEyeballsConfig>>) -> Self {
103        self.happy_eyeballs = config.into();
104        self
105    }
106}