use std::io::{Read, Result, Write};
use std::net::TcpStream;
use super::tls::TlsStream;
#[derive(Debug)]
pub enum DataStream<T>
where
T: TlsStream,
{
Tcp(TcpStream),
Ssl(Box<T>),
}
#[cfg(feature = "secure")]
#[cfg_attr(docsrs, doc(cfg(feature = "secure")))]
impl<T> DataStream<T>
where
T: TlsStream,
{
pub fn into_tcp_stream(self) -> TcpStream {
match self {
DataStream::Tcp(stream) => stream,
DataStream::Ssl(stream) => stream.tcp_stream(),
}
}
}
impl<T> DataStream<T>
where
T: TlsStream,
{
pub fn get_ref(&self) -> &TcpStream {
match self {
DataStream::Tcp(stream) => stream,
DataStream::Ssl(stream) => stream.get_ref(),
}
}
}
impl<T> Read for DataStream<T>
where
T: TlsStream,
{
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
match self {
DataStream::Tcp(stream) => stream.read(buf),
DataStream::Ssl(stream) => stream.mut_ref().read(buf),
}
}
}
impl<T> Write for DataStream<T>
where
T: TlsStream,
{
fn write(&mut self, buf: &[u8]) -> Result<usize> {
match self {
DataStream::Tcp(stream) => stream.write(buf),
DataStream::Ssl(stream) => stream.mut_ref().write(buf),
}
}
fn flush(&mut self) -> Result<()>
where
T: TlsStream,
{
match self {
DataStream::Tcp(stream) => stream.flush(),
DataStream::Ssl(stream) => stream.mut_ref().flush(),
}
}
}