use std::net::IpAddr;
use std::time::Duration;
#[derive(Debug, Clone)]
pub struct TcpConfig {
pub connect_timeout: Duration,
pub read_timeout: Option<Duration>,
pub write_timeout: Option<Duration>,
pub tcp_nodelay: bool,
pub keepalive: Option<Duration>,
pub port: u16,
}
impl Default for TcpConfig {
fn default() -> Self {
Self {
connect_timeout: Duration::from_secs(5),
read_timeout: Some(Duration::from_secs(30)),
write_timeout: Some(Duration::from_secs(30)),
tcp_nodelay: true,
keepalive: Some(Duration::from_mins(1)),
port: 502,
}
}
}
#[derive(Debug, Clone)]
pub struct TcpServerConfig {
pub tcp: TcpConfig,
pub max_connections: usize,
pub access_control: Option<AccessControl>,
}
impl Default for TcpServerConfig {
fn default() -> Self {
Self {
tcp: TcpConfig::default(),
max_connections: 64,
access_control: None,
}
}
}
#[derive(Debug, Clone)]
pub struct AccessControl {
pub default_mode: AccessMode,
pub rules: Vec<(IpAddr, AccessMode)>,
}
impl AccessControl {
#[must_use]
pub fn is_allowed(&self, ip: &IpAddr) -> bool {
for (rule_ip, mode) in &self.rules {
if rule_ip == ip {
return matches!(mode, AccessMode::Allow);
}
}
matches!(self.default_mode, AccessMode::Allow)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AccessMode {
Allow,
Deny,
}