#![cfg(feature = "sync")]
use std::{
io::{Read, Write},
net::TcpStream,
};
pub struct ReadHalf {
stream: TcpStream,
}
pub struct WriteHalf {
stream: TcpStream,
}
pub struct Stream {
stream: TcpStream,
remote_destination: String,
}
impl Stream {
pub(crate) fn from_stream(stream: TcpStream, remote_destination: String) -> Self {
Self {
stream,
remote_destination: remote_destination.trim_end().to_string(),
}
}
pub fn remote_destination(&self) -> &str {
&self.remote_destination
}
pub fn split(self) -> Option<(ReadHalf, WriteHalf)> {
let write = self.stream.try_clone().ok()?;
Some((
ReadHalf {
stream: self.stream,
},
WriteHalf { stream: write },
))
}
}
impl Read for Stream {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
self.stream.read(buf)
}
}
impl Read for ReadHalf {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
self.stream.read(buf)
}
}
impl Write for Stream {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
self.stream.write(buf)
}
fn write_vectored(&mut self, bufs: &[std::io::IoSlice<'_>]) -> std::io::Result<usize> {
self.stream.write_vectored(bufs)
}
fn flush(&mut self) -> std::io::Result<()> {
self.stream.flush()
}
fn write_all(&mut self, buf: &[u8]) -> std::io::Result<()> {
self.stream.write_all(buf)
}
fn write_fmt(&mut self, fmt: std::fmt::Arguments<'_>) -> std::io::Result<()> {
self.stream.write_fmt(fmt)
}
}
impl Write for WriteHalf {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
self.stream.write(buf)
}
fn write_vectored(&mut self, bufs: &[std::io::IoSlice<'_>]) -> std::io::Result<usize> {
self.stream.write_vectored(bufs)
}
fn flush(&mut self) -> std::io::Result<()> {
self.stream.flush()
}
fn write_all(&mut self, buf: &[u8]) -> std::io::Result<()> {
self.stream.write_all(buf)
}
fn write_fmt(&mut self, fmt: std::fmt::Arguments<'_>) -> std::io::Result<()> {
self.stream.write_fmt(fmt)
}
}