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