libp2p/builder/phase/
dns.rs1use std::marker::PhantomData;
2
3use super::*;
4use crate::SwarmBuilder;
5
6pub struct DnsPhase<T> {
7 pub(crate) transport: T,
8}
9
10#[cfg(all(not(target_arch = "wasm32"), feature = "async-std", feature = "dns"))]
11impl<T: AuthenticatedMultiplexedTransport> SwarmBuilder<super::provider::AsyncStd, DnsPhase<T>> {
12 pub fn with_dns(
13 self,
14 ) -> Result<
15 SwarmBuilder<
16 super::provider::AsyncStd,
17 WebsocketPhase<impl AuthenticatedMultiplexedTransport>,
18 >,
19 std::io::Error,
20 > {
21 Ok(SwarmBuilder {
22 keypair: self.keypair,
23 phantom: PhantomData,
24 phase: WebsocketPhase {
25 transport: libp2p_dns::async_std::Transport::system2(self.phase.transport)?,
26 },
27 })
28 }
29}
30
31#[cfg(all(not(target_arch = "wasm32"), feature = "tokio", feature = "dns"))]
32impl<T: AuthenticatedMultiplexedTransport> SwarmBuilder<super::provider::Tokio, DnsPhase<T>> {
33 pub fn with_dns(
34 self,
35 ) -> Result<
36 SwarmBuilder<
37 super::provider::Tokio,
38 WebsocketPhase<impl AuthenticatedMultiplexedTransport>,
39 >,
40 std::io::Error,
41 > {
42 Ok(SwarmBuilder {
43 keypair: self.keypair,
44 phantom: PhantomData,
45 phase: WebsocketPhase {
46 transport: libp2p_dns::tokio::Transport::system(self.phase.transport)?,
47 },
48 })
49 }
50}
51
52#[cfg(all(not(target_arch = "wasm32"), feature = "async-std", feature = "dns"))]
53impl<T: AuthenticatedMultiplexedTransport> SwarmBuilder<super::provider::AsyncStd, DnsPhase<T>> {
54 pub fn with_dns_config(
55 self,
56 cfg: libp2p_dns::ResolverConfig,
57 opts: libp2p_dns::ResolverOpts,
58 ) -> SwarmBuilder<
59 super::provider::AsyncStd,
60 WebsocketPhase<impl AuthenticatedMultiplexedTransport>,
61 > {
62 SwarmBuilder {
63 keypair: self.keypair,
64 phantom: PhantomData,
65 phase: WebsocketPhase {
66 transport: libp2p_dns::async_std::Transport::custom2(
67 self.phase.transport,
68 cfg,
69 opts,
70 ),
71 },
72 }
73 }
74}
75
76#[cfg(all(not(target_arch = "wasm32"), feature = "tokio", feature = "dns"))]
77impl<T: AuthenticatedMultiplexedTransport> SwarmBuilder<super::provider::Tokio, DnsPhase<T>> {
78 pub fn with_dns_config(
79 self,
80 cfg: libp2p_dns::ResolverConfig,
81 opts: libp2p_dns::ResolverOpts,
82 ) -> SwarmBuilder<super::provider::Tokio, WebsocketPhase<impl AuthenticatedMultiplexedTransport>>
83 {
84 SwarmBuilder {
85 keypair: self.keypair,
86 phantom: PhantomData,
87 phase: WebsocketPhase {
88 transport: libp2p_dns::tokio::Transport::custom(self.phase.transport, cfg, opts),
89 },
90 }
91 }
92}
93
94impl<Provider, T> SwarmBuilder<Provider, DnsPhase<T>> {
95 pub(crate) fn without_dns(self) -> SwarmBuilder<Provider, WebsocketPhase<T>> {
96 SwarmBuilder {
97 keypair: self.keypair,
98 phantom: PhantomData,
99 phase: WebsocketPhase {
100 transport: self.phase.transport,
101 },
102 }
103 }
104}
105
106impl<Provider, T: AuthenticatedMultiplexedTransport> SwarmBuilder<Provider, DnsPhase<T>> {
108 pub fn with_behaviour<B, R: TryIntoBehaviour<B>>(
109 self,
110 constructor: impl FnOnce(&libp2p_identity::Keypair) -> R,
111 ) -> Result<SwarmBuilder<Provider, SwarmPhase<T, B>>, R::Error> {
112 self.without_dns()
113 .without_websocket()
114 .without_relay()
115 .with_behaviour(constructor)
116 }
117}