1use std::net::SocketAddr;
3
4use tokio_tcp::TcpStream;
5use tokio_udp::UdpSocket;
6use trust_dns::{
7 client::{BasicClientHandle, ClientFuture, ClientHandle},
8 proto::{udp::UdpResponse, xfer::dns_multiplexer::DnsMultiplexerSerialResponse},
9 tcp::TcpClientStream,
10 udp::UdpClientStream,
11};
12
13pub type RuntimeHandle = tokio::runtime::current_thread::Handle;
14
15pub trait DnsOpen: Clone {
16 type Client: ClientHandle;
17 fn open(&mut self, runtime: RuntimeHandle, addr: SocketAddr) -> Self::Client;
18}
19
20#[derive(Debug, Clone)]
21pub struct TcpOpen;
22
23impl DnsOpen for TcpOpen {
24 type Client = BasicClientHandle<DnsMultiplexerSerialResponse>;
25 fn open(&mut self, runtime: RuntimeHandle, addr: SocketAddr) -> Self::Client {
26 let (connect, handle) = TcpClientStream::<TcpStream>::new(addr);
27 let (bg, client) = ClientFuture::new(connect, handle, None);
28 runtime.spawn(bg).unwrap();
29 client
30 }
31}
32
33#[derive(Debug, Clone)]
34pub struct UdpOpen;
35
36impl DnsOpen for UdpOpen {
37 type Client = BasicClientHandle<UdpResponse<tokio_udp::UdpSocket>>;
38 fn open(&mut self, runtime: RuntimeHandle, addr: SocketAddr) -> Self::Client {
39 let stream = UdpClientStream::<UdpSocket>::new(addr);
40 let (bg, client) = ClientFuture::connect(stream);
41 runtime.spawn(bg).unwrap();
42 client
43 }
44}