1#![deny(rust_2018_idioms, warnings)]
8#![allow(clippy::type_complexity)]
9#![recursion_limit = "128"]
10
11#[macro_use]
12extern crate log;
13
14mod connect;
15mod connector;
16mod error;
17mod resolve;
18mod service;
19pub mod ssl;
20
21#[cfg(feature = "uri")]
22mod uri;
23
24use actori_rt::{net::TcpStream, Arbiter};
25use actori_service::{pipeline, pipeline_factory, Service, ServiceFactory};
26use trust_dns_resolver::config::{ResolverConfig, ResolverOpts};
27use trust_dns_resolver::system_conf::read_system_conf;
28use trust_dns_resolver::AsyncResolver;
29
30pub mod resolver {
31 pub use trust_dns_resolver::config::{ResolverConfig, ResolverOpts};
32 pub use trust_dns_resolver::system_conf::read_system_conf;
33 pub use trust_dns_resolver::{error::ResolveError, AsyncResolver};
34}
35
36pub use self::connect::{Address, Connect, Connection};
37pub use self::connector::{TcpConnector, TcpConnectorFactory};
38pub use self::error::ConnectError;
39pub use self::resolve::{Resolver, ResolverFactory};
40pub use self::service::{ConnectService, ConnectServiceFactory, TcpConnectService};
41
42pub fn start_resolver(cfg: ResolverConfig, opts: ResolverOpts) -> AsyncResolver {
43 let (resolver, bg) = AsyncResolver::new(cfg, opts);
44 actori_rt::spawn(bg);
45 resolver
46}
47
48struct DefaultResolver(AsyncResolver);
49
50pub(crate) fn get_default_resolver() -> AsyncResolver {
51 if Arbiter::contains_item::<DefaultResolver>() {
52 Arbiter::get_item(|item: &DefaultResolver| item.0.clone())
53 } else {
54 let (cfg, opts) = match read_system_conf() {
55 Ok((cfg, opts)) => (cfg, opts),
56 Err(e) => {
57 log::error!("TRust-DNS can not load system config: {}", e);
58 (ResolverConfig::default(), ResolverOpts::default())
59 }
60 };
61
62 let (resolver, bg) = AsyncResolver::new(cfg, opts);
63 actori_rt::spawn(bg);
64
65 Arbiter::set_item(DefaultResolver(resolver.clone()));
66 resolver
67 }
68}
69
70pub fn start_default_resolver() -> AsyncResolver {
71 get_default_resolver()
72}
73
74pub fn new_connector<T: Address + 'static>(
76 resolver: AsyncResolver,
77) -> impl Service<Request = Connect<T>, Response = Connection<T, TcpStream>, Error = ConnectError>
78 + Clone {
79 pipeline(Resolver::new(resolver)).and_then(TcpConnector::new())
80}
81
82pub fn new_connector_factory<T: Address + 'static>(
84 resolver: AsyncResolver,
85) -> impl ServiceFactory<
86 Config = (),
87 Request = Connect<T>,
88 Response = Connection<T, TcpStream>,
89 Error = ConnectError,
90 InitError = (),
91> + Clone {
92 pipeline_factory(ResolverFactory::new(resolver)).and_then(TcpConnectorFactory::new())
93}
94
95pub fn default_connector<T: Address + 'static>(
97) -> impl Service<Request = Connect<T>, Response = Connection<T, TcpStream>, Error = ConnectError>
98 + Clone {
99 pipeline(Resolver::default()).and_then(TcpConnector::new())
100}
101
102pub fn default_connector_factory<T: Address + 'static>() -> impl ServiceFactory<
104 Config = (),
105 Request = Connect<T>,
106 Response = Connection<T, TcpStream>,
107 Error = ConnectError,
108 InitError = (),
109> + Clone {
110 pipeline_factory(ResolverFactory::default()).and_then(TcpConnectorFactory::new())
111}