use std::io;
use futures::{AsyncSink, Poll, Sink, StartSend, Stream};
use tokio::io::{AsyncRead, AsyncWrite};
use tokio_codec::{Decoder, Framed};
use super::codec::Codec;
use super::message::Message;
pub struct Transport<T: AsyncRead + AsyncWrite>(Framed<T, Codec>);
impl<T> Transport<T>
where
T: AsyncRead + AsyncWrite,
{
pub fn new(stream: T) -> Self {
Transport(Codec.framed(stream))
}
pub fn send(&mut self, message: Message) {
debug!("sending message to remote peer: {:?}", message);
match self.start_send(message) {
Ok(AsyncSink::Ready) => (),
Ok(AsyncSink::NotReady(_message)) => panic!("The sink is full."),
Err(e) => panic!("An error occured while trying to send message: {:?}", e),
}
}
}
impl<T> Stream for Transport<T>
where
T: AsyncRead + AsyncWrite,
{
type Item = Message;
type Error = io::Error;
fn poll(&mut self) -> Poll<Option<Self::Item>, Self::Error> {
self.0.poll()
}
}
impl<T> Sink for Transport<T>
where
T: AsyncRead + AsyncWrite,
{
type SinkItem = Message;
type SinkError = io::Error;
fn start_send(&mut self, item: Self::SinkItem) -> StartSend<Self::SinkItem, Self::SinkError> {
self.0.start_send(item)
}
fn poll_complete(&mut self) -> Poll<(), Self::SinkError> {
self.0.poll_complete()
}
}