mod dns_cache;
mod inner;
mod resolver;
mod wait_queue;
use crate::dns_cache::InMemoryDNSCache;
use crate::inner::TCPConnectShared;
use crate::resolver::ToSocketAddrDNSResolver;
use std::io;
use std::net::TcpStream;
use std::sync::Arc;
use std::time::Duration;
#[cfg(test)]
mod test_utils;
pub struct TCPConnect {
inner: Arc<TCPConnectShared<InMemoryDNSCache, ToSocketAddrDNSResolver>>,
}
impl TCPConnect {
pub fn builder() -> TCPConnectBuilder {
TCPConnectBuilder::default()
}
pub fn connect(&self, addr: &str) -> io::Result<TcpStream> {
self.inner.connect(addr)
}
}
impl Clone for TCPConnect {
fn clone(&self) -> Self {
TCPConnect {
inner: self.inner.clone(),
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct TCPConnectBuilder {
dns_ttl: Duration,
dns_max_stale_time: Duration,
}
impl TCPConnectBuilder {
pub fn dns_ttl(mut self, dns_ttl: Duration) -> TCPConnectBuilder {
self.dns_ttl = dns_ttl;
self
}
pub fn dns_max_stale_time(mut self, dns_max_stale_time: Duration) -> TCPConnectBuilder {
self.dns_max_stale_time = dns_max_stale_time;
self
}
pub fn build(self) -> TCPConnect {
let inner = Arc::new(TCPConnectShared::new(
Arc::new(InMemoryDNSCache::new(self.dns_ttl, self.dns_max_stale_time)),
Arc::new(ToSocketAddrDNSResolver::new()),
));
TCPConnect { inner }
}
}
impl Default for TCPConnectBuilder {
fn default() -> Self {
TCPConnectBuilder {
dns_ttl: Duration::from_secs(60),
dns_max_stale_time: Duration::from_secs(1),
}
}
}