1use std::io;
2use std::net::TcpStream;
3
4use async_io::Async;
5use async_net::AsyncToSocketAddrs;
6use imap_patch_for_async_imap_lite as imap;
7
8#[cfg(feature = "async_native_tls")]
9pub use async_stream_tls_upgrader::AsyncNativeTlsClientTlsUpgrader;
10#[cfg(feature = "async_tls")]
11pub use async_stream_tls_upgrader::AsyncTlsClientTlsUpgrader;
12
13use crate::connection::{
14 AsyncRead, AsyncWrite, TlsClientUpgrader, UpgradableAsyncStream, UpgraderExtRefer,
15};
16use crate::imap::{Error, Result};
17
18pub async fn connect_async<A: AsyncToSocketAddrs, ASTU>(
20 addr: A,
21 tls_upgrader: ASTU,
22 debug: Option<bool>,
23) -> Result<AsyncClient<TcpStream, ASTU>>
24where
25 ASTU: TlsClientUpgrader<Async<TcpStream>> + UpgraderExtRefer<Async<TcpStream>> + Unpin,
26 ASTU::Output: AsyncRead + AsyncWrite + Unpin,
27{
28 let addr = addr
29 .to_socket_addrs()
30 .await?
31 .next()
32 .ok_or(Error::Io(io::Error::new(
33 io::ErrorKind::InvalidInput,
34 "invalid addr",
35 )))?;
36
37 let stream = Async::<TcpStream>::connect(addr).await?;
38 let mut stream = UpgradableAsyncStream::new(stream, tls_upgrader);
39 stream.upgrade().await?;
40
41 let conn = AsyncConnection::new(stream, debug.unwrap_or(false), false).await;
42 let mut client = AsyncClient::new(conn);
43
44 client.read_greeting().await?;
45
46 Ok(client)
47}
48
49mod client;
53mod connection;
54mod session;
55mod util;
56
57pub use client::AsyncClient;
58pub use connection::AsyncConnection;
59pub use session::AsyncSession;