dope-session 0.2.3

Thin io_uring adaptor with "Manifolds"
Documentation
use crate::pool::slot::WRITE_BUF_CAP;

pub trait WriteBufStorage: Default + 'static {
    fn as_slice(&self) -> &[u8];
    fn as_mut_slice(&mut self) -> &mut [u8];
}

impl WriteBufStorage for () {
    #[inline(always)]
    fn as_slice(&self) -> &[u8] {
        &[]
    }
    #[inline(always)]
    fn as_mut_slice(&mut self) -> &mut [u8] {
        &mut []
    }
}

#[repr(transparent)]
pub struct WriteBufArr(pub(crate) [u8; WRITE_BUF_CAP]);

impl Default for WriteBufArr {
    #[inline(always)]
    fn default() -> Self {
        Self([0u8; WRITE_BUF_CAP])
    }
}

impl WriteBufStorage for WriteBufArr {
    #[inline(always)]
    fn as_slice(&self) -> &[u8] {
        &self.0
    }
    #[inline(always)]
    fn as_mut_slice(&mut self) -> &mut [u8] {
        &mut self.0
    }
}

pub trait CodecLayer: 'static {
    type ConnState: Default + 'static;
    type Staging: WriteBufStorage;
    const IS_PASSTHROUGH: bool;

    fn is_active(state: &Self::ConnState) -> bool;
    fn process_inbound(state: &mut Self::ConnState, wire_in: &[u8]);
    fn process_outbound(state: &mut Self::ConnState, plaintext_in: &[u8]);
    fn take_plaintext(state: &mut Self::ConnState) -> Vec<u8>;
    fn install_plaintext(state: &mut Self::ConnState, plaintext: Vec<u8>);
    fn take_inflight(state: &mut Self::ConnState) -> Option<(*const u8, u32)>;
    fn consume_inflight(state: &mut Self::ConnState, n: usize) -> bool;
    fn has_inflight(state: &Self::ConnState) -> bool;
    fn wire_slice(state: &Self::ConnState) -> &[u8];
    fn close_pending(state: &Self::ConnState) -> bool;
}

pub struct Plain;

impl CodecLayer for Plain {
    type ConnState = ();
    type Staging = ();
    const IS_PASSTHROUGH: bool = true;

    #[inline(always)]
    fn is_active(_: &()) -> bool {
        true
    }
    #[inline(always)]
    fn process_inbound(_: &mut (), _: &[u8]) {}
    #[inline(always)]
    fn process_outbound(_: &mut (), _: &[u8]) {}
    #[inline(always)]
    fn take_plaintext(_: &mut ()) -> Vec<u8> {
        Vec::new()
    }
    #[inline(always)]
    fn install_plaintext(_: &mut (), _: Vec<u8>) {}
    #[inline(always)]
    fn take_inflight(_: &mut ()) -> Option<(*const u8, u32)> {
        None
    }
    #[inline(always)]
    fn consume_inflight(_: &mut (), _: usize) -> bool {
        false
    }
    #[inline(always)]
    fn has_inflight(_: &()) -> bool {
        false
    }
    #[inline(always)]
    fn wire_slice(_: &()) -> &[u8] {
        &[]
    }
    #[inline(always)]
    fn close_pending(_: &()) -> bool {
        false
    }
}