1use crate::pool::slot::WRITE_BUF_CAP;
2
3pub trait WriteBufStorage: Default + 'static {
11 fn as_slice(&self) -> &[u8];
12 fn as_mut_slice(&mut self) -> &mut [u8];
13}
14
15impl WriteBufStorage for () {
16 #[inline(always)]
17 fn as_slice(&self) -> &[u8] {
18 &[]
19 }
20 #[inline(always)]
21 fn as_mut_slice(&mut self) -> &mut [u8] {
22 &mut []
23 }
24}
25
26#[repr(transparent)]
29pub struct WriteBufArr(pub(crate) [u8; WRITE_BUF_CAP]);
30
31impl Default for WriteBufArr {
32 #[inline(always)]
33 fn default() -> Self {
34 Self([0u8; WRITE_BUF_CAP])
35 }
36}
37
38impl WriteBufStorage for WriteBufArr {
39 #[inline(always)]
40 fn as_slice(&self) -> &[u8] {
41 &self.0
42 }
43 #[inline(always)]
44 fn as_mut_slice(&mut self) -> &mut [u8] {
45 &mut self.0
46 }
47}
48
49pub trait CodecLayer: 'static {
69 type ConnState: Default + 'static;
70 type WriteBuf: WriteBufStorage;
71
72 const IS_PASSTHROUGH: bool;
77
78 fn is_active(state: &Self::ConnState) -> bool;
79 fn process_inbound(state: &mut Self::ConnState, wire_in: &[u8]);
80 fn process_outbound(state: &mut Self::ConnState, plaintext_in: &[u8]);
81 fn take_plaintext(state: &mut Self::ConnState) -> Vec<u8>;
82 fn install_plaintext(state: &mut Self::ConnState, plaintext: Vec<u8>);
83 fn take_inflight(state: &mut Self::ConnState) -> Option<(*const u8, u32)>;
84 fn consume_inflight(state: &mut Self::ConnState, n: usize) -> bool;
85 fn has_inflight(state: &Self::ConnState) -> bool;
86 fn wire_slice(state: &Self::ConnState) -> &[u8];
87 fn close_pending(state: &Self::ConnState) -> bool;
88}
89
90pub struct Plain;
95
96impl CodecLayer for Plain {
97 type ConnState = ();
98 type WriteBuf = ();
99 const IS_PASSTHROUGH: bool = true;
100
101 #[inline(always)]
102 fn is_active(_: &()) -> bool {
103 true
104 }
105 #[inline(always)]
106 fn process_inbound(_: &mut (), _: &[u8]) {}
107 #[inline(always)]
108 fn process_outbound(_: &mut (), _: &[u8]) {}
109 #[inline(always)]
110 fn take_plaintext(_: &mut ()) -> Vec<u8> {
111 Vec::new()
112 }
113 #[inline(always)]
114 fn install_plaintext(_: &mut (), _: Vec<u8>) {}
115 #[inline(always)]
116 fn take_inflight(_: &mut ()) -> Option<(*const u8, u32)> {
117 None
118 }
119 #[inline(always)]
120 fn consume_inflight(_: &mut (), _: usize) -> bool {
121 false
122 }
123 #[inline(always)]
124 fn has_inflight(_: &()) -> bool {
125 false
126 }
127 #[inline(always)]
128 fn wire_slice(_: &()) -> &[u8] {
129 &[]
130 }
131 #[inline(always)]
132 fn close_pending(_: &()) -> bool {
133 false
134 }
135}