use async_trait::async_trait;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use super::stream_async::AsyncByteStream;
use super::TransportError;
pub struct TokioAsyncTransport<T> {
inner: T,
}
impl<T> TokioAsyncTransport<T> {
pub fn new(inner: T) -> Self {
Self { inner }
}
pub fn into_inner(self) -> T {
self.inner
}
}
#[async_trait(?Send)]
impl<T> AsyncByteStream for TokioAsyncTransport<T>
where
T: AsyncReadExt + AsyncWriteExt + Unpin,
{
async fn read_async(&mut self, buf: &mut [u8]) -> Result<usize, TransportError> {
self.inner
.read(buf)
.await
.map_err(|_| TransportError::IoFailed("tokio read failed"))
}
async fn write_all_async(&mut self, data: &[u8]) -> Result<(), TransportError> {
self.inner
.write_all(data)
.await
.map_err(|_| TransportError::IoFailed("tokio write_all failed"))?;
self.inner
.flush()
.await
.map_err(|_| TransportError::IoFailed("tokio flush failed"))?;
Ok(())
}
}