@@ -6,6 +6,9 @@ use crate::domains::{
66 TSerdeWrite ,
77} ;
88
9+ use async_trait:: async_trait;
10+ use bincode:: BorrowDecode ;
11+
912use bytes:: BytesMut ;
1013use std:: fmt:: Debug ;
1114use std:: io:: ErrorKind ;
@@ -65,7 +68,8 @@ impl<T: AsyncReadExt + std::marker::Unpin + Sync + Send + Debug + 'static> TSerd
6568 Ok ( parsed_values)
6669 }
6770 async fn receive_connection_msgs ( & mut self ) -> Result < String , IoError > {
68- self . deserialized_read ( ) . await
71+ let mut buffer = BytesMut :: new ( ) ;
72+ self . deserialized_read ( & mut buffer) . await
6973 }
7074}
7175
@@ -92,35 +96,53 @@ impl<T: AsyncWriteExt + std::marker::Unpin + Sync + Send + Debug + 'static> TSer
9296 }
9397}
9498
95- impl < T : AsyncReadExt + std:: marker:: Unpin + Sync + Send + Debug + ' static > TSerdeRead for T {
96- async fn deserialized_read < U > ( & mut self ) -> Result < U , IoError >
99+ #[ async_trait]
100+ impl < T > TSerdeRead for T
101+ where
102+ T : AsyncReadExt + Unpin + Sync + Send + Debug + ' static ,
103+ {
104+ async fn deserialized_read < ' a , U > ( & mut self , buffer : & ' a mut BytesMut ) -> Result < U , IoError >
97105 where
98- U : bincode :: Decode < ( ) > ,
106+ U : BorrowDecode < ' a , ( ) > + Send ,
99107 {
100- let mut buffer = BytesMut :: with_capacity ( INITIAL_CAPACITY ) ;
101- self . read_bytes ( & mut buffer) . await ?;
108+ self . read_bytes ( buffer) . await ?;
102109
103- let ( request, _) = bincode:: decode_from_slice ( & buffer, SERDE_CONFIG )
104- . map_err ( |e| IoError :: Custom ( e. to_string ( ) ) ) ?;
110+ let ( request, _) = bincode:: borrow_decode_from_slice ( & buffer[ ..] , SERDE_CONFIG ) . unwrap ( ) ;
105111
106112 Ok ( request)
107113 }
108114
109- async fn deserialized_reads < U > ( & mut self ) -> Result < Vec < U > , IoError >
115+ async fn deserialized_reads < ' a , U > (
116+ & mut self ,
117+ buffer : & ' a mut BytesMut ,
118+ ) -> Result < Vec < U > , IoError >
110119 where
111- U : bincode :: Decode < ( ) > ,
120+ U : BorrowDecode < ' a , ( ) > + Send ,
112121 {
113- let mut buffer = BytesMut :: with_capacity ( INITIAL_CAPACITY ) ;
114- self . read_bytes ( & mut buffer) . await ?;
122+ // Read data from socket into buffer
123+ self . read_bytes ( buffer) . await ?;
115124
116125 let mut parsed_values = Vec :: new ( ) ;
117126
118- while !buffer. is_empty ( ) {
119- let ( request, size) = bincode:: decode_from_slice ( & buffer, SERDE_CONFIG )
120- . map_err ( |e| IoError :: Custom ( e. to_string ( ) ) ) ?;
121- parsed_values. push ( request) ;
122- buffer = buffer. split_off ( size) ;
127+ // Zero-copy slicing logic
128+ let mut slice = & buffer[ ..] ;
129+
130+ // Note: In a real protocol, you need a loop that checks if
131+ // there is enough data for a full frame before decoding.
132+ // This simple loop assumes the buffer contains perfect packets.
133+ while !slice. is_empty ( ) {
134+ match bincode:: borrow_decode_from_slice ( slice, SERDE_CONFIG ) {
135+ Ok ( ( request, size) ) => {
136+ parsed_values. push ( request) ;
137+ slice = & slice[ size..] ;
138+ } ,
139+ Err ( _) => {
140+ // Stop if we can't decode anymore (partial packet)
141+ break ;
142+ } ,
143+ }
123144 }
145+
124146 Ok ( parsed_values)
125147 }
126148}
@@ -226,7 +248,8 @@ pub mod test_tokio_stream_impl {
226248 let mut mock = MockAsyncStream :: new ( vec ! [ encoded_msg. into( ) ] ) ;
227249
228250 // 2. Act
229- let result: Result < Vec < TestMessage > , IoError > = mock. deserialized_reads ( ) . await ;
251+ let mut buffer = BytesMut :: new ( ) ;
252+ let result: Result < Vec < TestMessage > , IoError > = mock. deserialized_reads ( & mut buffer) . await ;
230253
231254 // 3. Assert
232255 let deserialized = result. unwrap ( ) ;
@@ -247,7 +270,8 @@ pub mod test_tokio_stream_impl {
247270 let mut mock = MockAsyncStream :: new ( vec ! [ raw_data] ) ;
248271
249272 // 2. Act
250- let result: Result < Vec < TestMessage > , IoError > = mock. deserialized_reads ( ) . await ;
273+ let mut buffer = BytesMut :: new ( ) ;
274+ let result: Result < Vec < TestMessage > , IoError > = mock. deserialized_reads ( & mut buffer) . await ;
251275
252276 // 3. Assert
253277 let deserialized = result. unwrap ( ) ;
0 commit comments