use socket2::SockAddr;
#[cfg(target_os = "windows")]
pub use crate::driver::op::ConnectNamedPipe;
#[cfg(feature = "time")]
pub use crate::driver::op::Timeout;
pub use crate::driver::op::{
Accept, Connect, ReadAt, RecvFromImpl, RecvImpl, SendImpl, SendToImpl, Sync, WriteAt,
};
use crate::{
buf::{AsIoSlicesMut, BufWrapperMut, IoBufMut, VectoredBufWrapper},
driver::{sockaddr_storage, socklen_t},
BufResult,
};
pub trait UpdateBufferLen {
fn update_buffer_len(self) -> Self;
}
macro_rules! impl_update_buffer_len {
($t:ident) => {
impl<'arena, T: IoBufMut<'arena>> UpdateBufferLen
for BufResult<'arena, usize, $t<'arena, T>>
{
fn update_buffer_len(self) -> Self {
let (res, mut buffer) = self;
if let Ok(init) = &res {
buffer.set_init(*init);
}
(res, buffer)
}
}
impl<'arena, T: IoBufMut<'arena>, O> UpdateBufferLen
for BufResult<'arena, (usize, O), $t<'arena, T>>
{
fn update_buffer_len(self) -> Self {
let (res, mut buffer) = self;
if let Ok((init, _)) = &res {
buffer.set_init(*init);
}
(res, buffer)
}
}
};
}
impl_update_buffer_len!(VectoredBufWrapper);
impl_update_buffer_len!(BufWrapperMut);
impl<'arena, T: IoBufMut<'arena>> UpdateBufferLen for BufResult<'arena, usize, T> {
fn update_buffer_len(self) -> Self {
let (res, mut buffer) = self;
if let Ok(init) = &res {
buffer.set_buf_init(*init);
}
(res, buffer)
}
}
impl<'arena, T: IoBufMut<'arena>, O> UpdateBufferLen for BufResult<'arena, (usize, O), T> {
fn update_buffer_len(self) -> Self {
let (res, mut buffer) = self;
if let Ok((init, _)) = &res {
buffer.set_buf_init(*init);
}
(res, buffer)
}
}
pub(crate) trait RecvResultExt {
type RecvFromResult;
fn map_addr(self) -> Self::RecvFromResult;
}
impl<'arena, T: 'arena> RecvResultExt
for BufResult<'arena, usize, (T, sockaddr_storage, socklen_t)>
{
type RecvFromResult = BufResult<'arena, (usize, SockAddr), T>;
fn map_addr(self) -> Self::RecvFromResult {
let (res, (buffer, addr_buffer, addr_size)) = self;
let res = res.map(|res| {
let addr = unsafe { SockAddr::new(addr_buffer, addr_size) };
(res, addr)
});
(res, buffer)
}
}
pub type Recv<'arena, T> = RecvImpl<'arena, T>;
pub type RecvVectored<'arena, T> = RecvImpl<'arena, VectoredBufWrapper<'arena, T>>;
pub type Send<'arena, T> = SendImpl<'arena, T>;
pub type SendVectored<'arena, T> = SendImpl<'arena, VectoredBufWrapper<'arena, T>>;
pub type RecvFrom<'arena, T> = RecvFromImpl<'arena, T>;
pub type RecvFromVectored<'arena, T> = RecvFromImpl<'arena, VectoredBufWrapper<'arena, T>>;
pub type SendTo<'arena, T> = SendToImpl<'arena, T>;
pub type SendToVectored<'arena, T> = SendToImpl<'arena, VectoredBufWrapper<'arena, T>>;