use std::io::{Read, Write, Result};
use std::net::TcpStream;
#[cfg(feature = "secure")]
use openssl::ssl::SslStream;
#[derive(Debug)]
pub enum DataStream {
Tcp(TcpStream),
#[cfg(feature = "secure")]
Ssl(SslStream<TcpStream>),
}
#[cfg(feature = "secure")]
impl DataStream {
pub fn into_tcp_stream(self) -> TcpStream {
match self {
DataStream::Tcp(stream) => stream,
DataStream::Ssl(stream) => stream.get_ref().try_clone().unwrap(),
}
}
pub fn is_ssl(&self) -> bool {
match self {
&DataStream::Ssl(_) => true,
_ => false
}
}
}
impl DataStream {
pub fn get_ref(&self) -> &TcpStream {
match self {
&DataStream::Tcp(ref stream) => stream,
#[cfg(feature = "secure")]
&DataStream::Ssl(ref stream) => stream.get_ref(),
}
}
}
impl Read for DataStream {
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
match self {
&mut DataStream::Tcp(ref mut stream) => stream.read(buf),
#[cfg(feature = "secure")]
&mut DataStream::Ssl(ref mut stream) => stream.read(buf),
}
}
}
impl Write for DataStream {
fn write(&mut self, buf: &[u8]) -> Result<usize> {
match self {
&mut DataStream::Tcp(ref mut stream) => stream.write(buf),
#[cfg(feature = "secure")]
&mut DataStream::Ssl(ref mut stream) => stream.write(buf),
}
}
fn flush(&mut self) -> Result<()> {
match self {
&mut DataStream::Tcp(ref mut stream) => stream.flush(),
#[cfg(feature = "secure")]
&mut DataStream::Ssl(ref mut stream) => stream.flush(),
}
}
}