use std::io::{self, Read, Write}; use futures::{Async, Poll}; use futures::sync::BiLock; use bytes::{Buf, BufMut}; use {AsyncRead, AsyncWrite}; /// The readable half of an object returned from `AsyncRead::split`. #[derive(Debug)] pub struct ReadHalf { handle: BiLock, } /// The writable half of an object returned from `AsyncRead::split`. #[derive(Debug)] pub struct WriteHalf { handle: BiLock, } pub fn split(t: T) -> (ReadHalf, WriteHalf) { let (a, b) = BiLock::new(t); (ReadHalf { handle: a }, WriteHalf { handle: b }) } fn would_block() -> io::Error { io::Error::new(io::ErrorKind::WouldBlock, "would block") } impl Read for ReadHalf { fn read(&mut self, buf: &mut [u8]) -> io::Result { match self.handle.poll_lock() { Async::Ready(mut l) => l.read(buf), Async::NotReady => Err(would_block()), } } } impl AsyncRead for ReadHalf { fn read_buf(&mut self, buf: &mut B) -> Poll { match self.handle.poll_lock() { Async::Ready(mut l) => l.read_buf(buf), Async::NotReady => Err(would_block()), } } } impl Write for WriteHalf { fn write(&mut self, buf: &[u8]) -> io::Result { match self.handle.poll_lock() { Async::Ready(mut l) => l.write(buf), Async::NotReady => Err(would_block()), } } fn flush(&mut self) -> io::Result<()> { match self.handle.poll_lock() { Async::Ready(mut l) => l.flush(), Async::NotReady => Err(would_block()), } } } impl AsyncWrite for WriteHalf { fn shutdown(&mut self) -> Poll<(), io::Error> { match self.handle.poll_lock() { Async::Ready(mut l) => l.shutdown(), Async::NotReady => Err(would_block()), } } fn write_buf(&mut self, buf: &mut B) -> Poll where Self: Sized, { match self.handle.poll_lock() { Async::Ready(mut l) => l.write_buf(buf), Async::NotReady => Err(would_block()), } } }