use crate::net::Socket;
use std::future;
use std::io::{self, Read, Write};
use std::task::{Context, Poll};
pub struct StdSocket<S> {
pub socket: S,
wants_read: bool,
wants_write: bool,
}
impl<S: Socket> StdSocket<S> {
pub fn new(socket: S) -> Self {
Self {
socket,
wants_read: false,
wants_write: false,
}
}
pub fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
let mut ready = !(self.wants_read || self.wants_write);
if self.wants_write && self.socket.poll_write_ready(cx)?.is_ready() {
self.wants_write = false;
ready |= true;
}
if self.wants_read && self.socket.poll_read_ready(cx)?.is_ready() {
self.wants_read = false;
ready |= true;
}
if ready {
Poll::Ready(Ok(()))
} else {
Poll::Pending
}
}
pub async fn ready(&mut self) -> io::Result<()> {
future::poll_fn(|cx| self.poll_ready(cx)).await
}
}
impl<S: Socket> Read for StdSocket<S> {
fn read(&mut self, mut buf: &mut [u8]) -> io::Result<usize> {
self.wants_read = true;
let read = self.socket.try_read(&mut buf)?;
self.wants_read = false;
Ok(read)
}
}
impl<S: Socket> Write for StdSocket<S> {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.wants_write = true;
let written = self.socket.try_write(buf)?;
self.wants_write = false;
Ok(written)
}
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}