use std::fmt::Debug;
use async_std::io::{Read, Write};
use async_std::net::TcpStream;
#[cfg(feature = "async-std-async-native-tls")]
mod native_tls;
#[cfg(feature = "async-std-async-native-tls")]
pub use self::native_tls::{AsyncNativeTlsConnector, AsyncNativeTlsStream};
#[cfg(any(
feature = "async-std-rustls-aws-lc-rs",
feature = "async-std-rustls-ring"
))]
mod rustls;
#[cfg(any(
feature = "async-std-rustls-aws-lc-rs",
feature = "async-std-rustls-ring"
))]
pub use self::rustls::{AsyncRustlsConnector, AsyncRustlsStream};
#[cfg(feature = "async-secure")]
#[async_trait::async_trait]
pub trait AsyncTlsConnector: Debug {
type Stream: AsyncStdTlsStream;
async fn connect(&self, domain: &str, stream: TcpStream) -> crate::FtpResult<Self::Stream>;
}
pub trait AsyncStdTlsStream: Debug + Read + Write + Unpin {
type InnerStream: Read + Write;
fn tcp_stream(self) -> TcpStream;
fn get_ref(&self) -> &TcpStream;
fn mut_ref(&mut self) -> &mut Self::InnerStream;
}
#[derive(Debug)]
pub struct AsyncNoTlsStream;
impl Read for AsyncNoTlsStream {
fn poll_read(
self: std::pin::Pin<&mut Self>,
_cx: &mut std::task::Context<'_>,
_buf: &mut [u8],
) -> std::task::Poll<std::io::Result<usize>> {
panic!()
}
}
impl Write for AsyncNoTlsStream {
fn poll_write(
self: std::pin::Pin<&mut Self>,
_cx: &mut std::task::Context<'_>,
_buf: &[u8],
) -> std::task::Poll<std::io::Result<usize>> {
panic!()
}
fn poll_flush(
self: std::pin::Pin<&mut Self>,
_cx: &mut std::task::Context<'_>,
) -> std::task::Poll<std::io::Result<()>> {
panic!()
}
fn poll_close(
self: std::pin::Pin<&mut Self>,
_cx: &mut std::task::Context<'_>,
) -> std::task::Poll<std::io::Result<()>> {
panic!()
}
}
impl AsyncStdTlsStream for AsyncNoTlsStream {
type InnerStream = TcpStream;
fn tcp_stream(self) -> TcpStream {
panic!()
}
fn get_ref(&self) -> &TcpStream {
panic!()
}
fn mut_ref(&mut self) -> &mut Self::InnerStream {
panic!()
}
}