1 use crate::conn::Connection; 2 use crate::conn::ConnectionExt; 3 use std::net::TcpStream; 4 5 impl Connection for TcpStream { 6 type Error = std::io::Error; 7 write(&mut self, byte: u8) -> Result<(), Self::Error>8 fn write(&mut self, byte: u8) -> Result<(), Self::Error> { 9 use std::io::Write; 10 11 Write::write_all(self, &[byte]) 12 } 13 write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error>14 fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error> { 15 use std::io::Write; 16 17 Write::write_all(self, buf) 18 } 19 flush(&mut self) -> Result<(), Self::Error>20 fn flush(&mut self) -> Result<(), Self::Error> { 21 use std::io::Write; 22 23 Write::flush(self) 24 } 25 on_session_start(&mut self) -> Result<(), Self::Error>26 fn on_session_start(&mut self) -> Result<(), Self::Error> { 27 // see issue #28 28 self.set_nodelay(true) 29 } 30 } 31 32 impl ConnectionExt for TcpStream { read(&mut self) -> Result<u8, Self::Error>33 fn read(&mut self) -> Result<u8, Self::Error> { 34 use std::io::Read; 35 36 self.set_nonblocking(false)?; 37 38 let mut buf = [0u8]; 39 match Read::read_exact(self, &mut buf) { 40 Ok(_) => Ok(buf[0]), 41 Err(e) => Err(e), 42 } 43 } 44 peek(&mut self) -> Result<Option<u8>, Self::Error>45 fn peek(&mut self) -> Result<Option<u8>, Self::Error> { 46 self.set_nonblocking(true)?; 47 48 let mut buf = [0u8]; 49 match Self::peek(self, &mut buf) { 50 Ok(_) => Ok(Some(buf[0])), 51 Err(ref e) if e.kind() == std::io::ErrorKind::WouldBlock => Ok(None), 52 Err(e) => Err(e), 53 } 54 } 55 } 56