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}