tdns_cli/
open.rs

1/// An abstraction over different ways to do DNS queries.
2use 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}