trust_dns_client/client/
client_connection.rs1use std::future::Future;
17use std::sync::Arc;
18
19use crate::op::{MessageFinalizer, MessageVerifier};
20#[cfg(feature = "dnssec")]
21#[cfg_attr(docsrs, doc(cfg(feature = "dnssec")))]
22use crate::proto::rr::dnssec::tsig::TSigner;
23#[cfg(feature = "dnssec")]
24#[cfg_attr(docsrs, doc(cfg(feature = "dnssec")))]
25use crate::proto::rr::dnssec::SigSigner;
26use crate::proto::{error::ProtoError, xfer::DnsRequestSender};
27
28use crate::proto::error::ProtoResult;
29use crate::proto::op::Message;
30use crate::proto::rr::Record;
31
32#[allow(missing_copy_implementations)]
34pub enum Signer {
35 #[cfg(feature = "dnssec")]
37 #[cfg_attr(docsrs, doc(cfg(feature = "dnssec")))]
38 Sig0(Box<SigSigner>),
39 #[cfg(feature = "dnssec")]
41 #[cfg_attr(docsrs, doc(cfg(feature = "dnssec")))]
42 TSIG(TSigner),
43}
44
45#[cfg(feature = "dnssec")]
46#[cfg_attr(docsrs, doc(cfg(feature = "dnssec")))]
47impl From<SigSigner> for Signer {
48 fn from(s: SigSigner) -> Self {
49 Self::Sig0(Box::new(s))
50 }
51}
52
53#[cfg(feature = "dnssec")]
54#[cfg_attr(docsrs, doc(cfg(feature = "dnssec")))]
55impl From<TSigner> for Signer {
56 fn from(s: TSigner) -> Self {
57 Self::TSIG(s)
58 }
59}
60
61impl MessageFinalizer for Signer {
62 #[allow(unreachable_patterns, unused_variables)]
63 fn finalize_message(
64 &self,
65 message: &Message,
66 time: u32,
67 ) -> ProtoResult<(Vec<Record>, Option<MessageVerifier>)> {
68 match self {
69 #[cfg(feature = "dnssec")]
70 #[cfg_attr(docsrs, doc(cfg(feature = "dnssec")))]
71 Self::Sig0(s0) => s0.finalize_message(message, time),
72 #[cfg(feature = "dnssec")]
73 #[cfg_attr(docsrs, doc(cfg(feature = "dnssec")))]
74 Self::TSIG(tsig) => tsig.finalize_message(message, time),
75 _ => unreachable!("the feature `dnssec` is required for Message signing"),
76 }
77 }
78}
79
80pub trait ClientConnection: 'static + Sized + Send + Sync + Unpin {
82 type Sender: DnsRequestSender;
84 type SenderFuture: Future<Output = Result<Self::Sender, ProtoError>> + 'static + Send + Unpin;
86
87 fn new_stream(&self, signer: Option<Arc<Signer>>) -> Self::SenderFuture;
89}