use std::net::SocketAddr;
use std::task::{Context, Poll};
use crate::Result;
use crate::async_cm::AsyncCmListener;
pub trait TransportBuilder: Clone + Send + Sync + Unpin + 'static {
type Transport: Transport + 'static;
fn connect(
&self,
addr: &SocketAddr,
) -> impl std::future::Future<Output = Result<Self::Transport>> + Send;
fn accept(
&self,
listener: &AsyncCmListener,
) -> impl std::future::Future<Output = Result<Self::Transport>> + Send;
}
#[derive(Debug, Default, Clone, Copy)]
pub struct RecvCompletion {
pub buf_idx: usize,
pub byte_len: usize,
}
pub trait Transport: Send + Sync {
fn send_copy(&mut self, data: &[u8]) -> Result<usize>;
fn poll_send_completion(&mut self, cx: &mut Context<'_>) -> Poll<Result<()>>;
fn poll_recv(
&mut self,
cx: &mut Context<'_>,
out: &mut [RecvCompletion],
) -> Poll<Result<usize>>;
fn recv_buf(&self, buf_idx: usize) -> &[u8];
fn repost_recv(&mut self, buf_idx: usize) -> Result<()>;
fn poll_disconnect(&mut self, cx: &mut Context<'_>) -> bool;
fn disconnect(&mut self) -> Result<()>;
fn local_addr(&self) -> Option<SocketAddr>;
fn peer_addr(&self) -> Option<SocketAddr>;
}