Skip to main content

dope_session/
codec.rs

1use crate::pool::slot::WRITE_BUF_CAP;
2
3pub trait WriteBufStorage: Default + 'static {
4    fn as_slice(&self) -> &[u8];
5    fn as_mut_slice(&mut self) -> &mut [u8];
6}
7
8impl WriteBufStorage for () {
9    #[inline(always)]
10    fn as_slice(&self) -> &[u8] {
11        &[]
12    }
13    #[inline(always)]
14    fn as_mut_slice(&mut self) -> &mut [u8] {
15        &mut []
16    }
17}
18
19#[repr(transparent)]
20pub struct WriteBufArr(pub(crate) [u8; WRITE_BUF_CAP]);
21
22impl Default for WriteBufArr {
23    #[inline(always)]
24    fn default() -> Self {
25        Self([0u8; WRITE_BUF_CAP])
26    }
27}
28
29impl WriteBufStorage for WriteBufArr {
30    #[inline(always)]
31    fn as_slice(&self) -> &[u8] {
32        &self.0
33    }
34    #[inline(always)]
35    fn as_mut_slice(&mut self) -> &mut [u8] {
36        &mut self.0
37    }
38}
39
40pub trait CodecLayer: 'static {
41    type ConnState: Default + 'static;
42    type Staging: WriteBufStorage;
43    const IS_PASSTHROUGH: bool;
44
45    fn is_active(state: &Self::ConnState) -> bool;
46    fn process_inbound(state: &mut Self::ConnState, wire_in: &[u8]);
47    fn process_outbound(state: &mut Self::ConnState, plaintext_in: &[u8]);
48    fn take_plaintext(state: &mut Self::ConnState) -> Vec<u8>;
49    fn install_plaintext(state: &mut Self::ConnState, plaintext: Vec<u8>);
50    fn take_inflight(state: &mut Self::ConnState) -> Option<(*const u8, u32)>;
51    fn consume_inflight(state: &mut Self::ConnState, n: usize) -> bool;
52    fn has_inflight(state: &Self::ConnState) -> bool;
53    fn wire_slice(state: &Self::ConnState) -> &[u8];
54    fn close_pending(state: &Self::ConnState) -> bool;
55}
56
57pub struct Plain;
58
59impl CodecLayer for Plain {
60    type ConnState = ();
61    type Staging = ();
62    const IS_PASSTHROUGH: bool = true;
63
64    #[inline(always)]
65    fn is_active(_: &()) -> bool {
66        true
67    }
68    #[inline(always)]
69    fn process_inbound(_: &mut (), _: &[u8]) {}
70    #[inline(always)]
71    fn process_outbound(_: &mut (), _: &[u8]) {}
72    #[inline(always)]
73    fn take_plaintext(_: &mut ()) -> Vec<u8> {
74        Vec::new()
75    }
76    #[inline(always)]
77    fn install_plaintext(_: &mut (), _: Vec<u8>) {}
78    #[inline(always)]
79    fn take_inflight(_: &mut ()) -> Option<(*const u8, u32)> {
80        None
81    }
82    #[inline(always)]
83    fn consume_inflight(_: &mut (), _: usize) -> bool {
84        false
85    }
86    #[inline(always)]
87    fn has_inflight(_: &()) -> bool {
88        false
89    }
90    #[inline(always)]
91    fn wire_slice(_: &()) -> &[u8] {
92        &[]
93    }
94    #[inline(always)]
95    fn close_pending(_: &()) -> bool {
96        false
97    }
98}