libp2p/builder/phase/
dns.rs

1use super::*;
2use crate::SwarmBuilder;
3use std::marker::PhantomData;
4
5pub struct DnsPhase<T> {
6    pub(crate) transport: T,
7}
8
9#[cfg(all(not(target_arch = "wasm32"), feature = "async-std", feature = "dns"))]
10impl<T: AuthenticatedMultiplexedTransport> SwarmBuilder<super::provider::AsyncStd, DnsPhase<T>> {
11    pub async fn with_dns(
12        self,
13    ) -> Result<
14        SwarmBuilder<
15            super::provider::AsyncStd,
16            WebsocketPhase<impl AuthenticatedMultiplexedTransport>,
17        >,
18        std::io::Error,
19    > {
20        Ok(SwarmBuilder {
21            keypair: self.keypair,
22            phantom: PhantomData,
23            phase: WebsocketPhase {
24                transport: libp2p_dns::async_std::Transport::system(self.phase.transport).await?,
25            },
26        })
27    }
28}
29
30#[cfg(all(not(target_arch = "wasm32"), feature = "tokio", feature = "dns"))]
31impl<T: AuthenticatedMultiplexedTransport> SwarmBuilder<super::provider::Tokio, DnsPhase<T>> {
32    pub fn with_dns(
33        self,
34    ) -> Result<
35        SwarmBuilder<
36            super::provider::Tokio,
37            WebsocketPhase<impl AuthenticatedMultiplexedTransport>,
38        >,
39        std::io::Error,
40    > {
41        Ok(SwarmBuilder {
42            keypair: self.keypair,
43            phantom: PhantomData,
44            phase: WebsocketPhase {
45                transport: libp2p_dns::tokio::Transport::system(self.phase.transport)?,
46            },
47        })
48    }
49}
50
51impl<Provider, T> SwarmBuilder<Provider, DnsPhase<T>> {
52    pub(crate) fn without_dns(self) -> SwarmBuilder<Provider, WebsocketPhase<T>> {
53        SwarmBuilder {
54            keypair: self.keypair,
55            phantom: PhantomData,
56            phase: WebsocketPhase {
57                transport: self.phase.transport,
58            },
59        }
60    }
61}
62
63// Shortcuts
64impl<Provider, T: AuthenticatedMultiplexedTransport> SwarmBuilder<Provider, DnsPhase<T>> {
65    pub fn with_behaviour<B, R: TryIntoBehaviour<B>>(
66        self,
67        constructor: impl FnOnce(&libp2p_identity::Keypair) -> R,
68    ) -> Result<SwarmBuilder<Provider, SwarmPhase<T, B>>, R::Error> {
69        self.without_dns()
70            .without_websocket()
71            .without_relay()
72            .with_behaviour(constructor)
73    }
74}