1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
#[cfg(unix)] use fd_adapter::FdAdapter; use mio::{net::TcpStream, Evented, Poll, PollOpt, Ready, Token}; use std::io::{self, Read, Write}; #[cfg(unix)] use std::os::unix::io::RawFd; pub enum Transport { TcpStream(TcpStream), #[cfg(unix)] FdAdapter(FdAdapter), } impl Read for Transport { fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { match *self { #[cfg(unix)] Transport::FdAdapter(ref mut x) => x.read(buf), Transport::TcpStream(ref mut x) => x.read(buf), } } } impl Write for Transport { fn write(&mut self, buf: &[u8]) -> io::Result<usize> { match *self { #[cfg(unix)] Transport::FdAdapter(ref mut x) => x.write(buf), Transport::TcpStream(ref mut x) => x.write(buf), } } fn flush(&mut self) -> io::Result<()> { match *self { #[cfg(unix)] Transport::FdAdapter(ref mut x) => x.flush(), Transport::TcpStream(ref mut x) => x.flush(), } } } impl Evented for Transport { fn register(&self, poll: &Poll, token: Token, interest: Ready, opts: PollOpt) -> io::Result<()> { match *self { #[cfg(unix)] Transport::FdAdapter(ref x) => x.register(poll, token, interest, opts), Transport::TcpStream(ref x) => x.register(poll, token, interest, opts), } } fn reregister(&self, poll: &Poll, token: Token, interest: Ready, opts: PollOpt) -> io::Result<()> { match *self { #[cfg(unix)] Transport::FdAdapter(ref x) => x.reregister(poll, token, interest, opts), Transport::TcpStream(ref x) => x.reregister(poll, token, interest, opts), } } fn deregister(&self, poll: &Poll) -> io::Result<()> { match *self { #[cfg(unix)] Transport::FdAdapter(ref x) => x.deregister(poll), Transport::TcpStream(ref x) => x.deregister(poll), } } } #[cfg(unix)] impl From<RawFd> for Transport { fn from(fd: RawFd) -> Transport { Transport::FdAdapter(FdAdapter::from(fd)) } } impl From<TcpStream> for Transport { fn from(stream: TcpStream) -> Transport { Transport::TcpStream(stream) } } impl From<::std::net::TcpStream> for Transport { fn from(stream: ::std::net::TcpStream) -> Transport { let stream = ::mio::net::TcpStream::from_stream(stream).unwrap(); From::from(stream) } }