#![cfg(feature = "async")]
use futures::{AsyncRead, AsyncWrite};
use tokio::net::TcpStream;
use tokio_util::compat::Compat;
use std::{
pin::Pin,
task::{Context, Poll},
};
pub struct Stream {
stream: Compat<TcpStream>,
remote_destination: String,
}
impl Stream {
pub(crate) fn from_stream(stream: Compat<TcpStream>, remote_destination: String) -> Self {
Self {
stream,
remote_destination,
}
}
pub fn remote_destination(&self) -> &str {
&self.remote_destination
}
}
impl AsyncRead for Stream {
fn poll_read(
mut self: Pin<&mut Self>,
cx: &mut Context<'_>,
buf: &mut [u8],
) -> Poll<std::io::Result<usize>> {
std::pin::pin!(&mut self.stream).poll_read(cx, buf)
}
}
impl AsyncWrite for Stream {
fn poll_write(
mut self: Pin<&mut Self>,
cx: &mut Context<'_>,
buf: &[u8],
) -> Poll<std::io::Result<usize>> {
std::pin::pin!(&mut self.stream).as_mut().poll_write(cx, buf)
}
fn poll_write_vectored(
mut self: Pin<&mut Self>,
cx: &mut Context<'_>,
bufs: &[std::io::IoSlice<'_>],
) -> Poll<std::io::Result<usize>> {
std::pin::pin!(&mut self.stream).as_mut().poll_write_vectored(cx, bufs)
}
fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<std::io::Result<()>> {
std::pin::pin!(&mut self.stream).as_mut().poll_flush(cx)
}
fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<std::io::Result<()>> {
std::pin::pin!(&mut self.stream).poll_close(cx)
}
}