use core::ffi::{c_int, c_uint, c_void};
use core::ptr::NonNull;
bun_opaque::opaque_ffi! {
pub struct Socket;
}
unsafe extern "C" {
safe fn us_quic_socket_make_stream(s: &mut Socket);
safe fn us_quic_socket_streams_avail(s: &mut Socket) -> c_uint;
fn us_quic_socket_status(s: *mut Socket, buf: *mut u8, len: c_uint) -> c_int;
safe fn us_quic_socket_close(s: &mut Socket);
safe fn us_quic_socket_ext(s: &mut Socket) -> *mut c_void;
}
impl Socket {
#[inline]
pub fn make_stream(&mut self) {
us_quic_socket_make_stream(self)
}
#[inline]
pub fn streams_avail(&mut self) -> c_uint {
us_quic_socket_streams_avail(self)
}
#[inline]
pub fn status(&mut self, buf: &mut [u8]) -> c_int {
unsafe {
us_quic_socket_status(
self,
buf.as_mut_ptr(),
c_uint::try_from(buf.len()).expect("int cast"),
)
}
}
#[inline]
pub fn close(&mut self) {
us_quic_socket_close(self)
}
#[inline]
pub fn ext<T>(&mut self) -> &mut Option<NonNull<T>> {
unsafe { &mut *us_quic_socket_ext(self).cast::<Option<NonNull<T>>>() }
}
}