@@ -12,26 +12,29 @@ use tokio::io::AsyncWrite;
1212use tokio_util:: sync:: ReusableBoxFuture ;
1313
1414use super :: { bin, oneshot} ;
15+ use crate :: codec;
1516
1617/// Size handling mode for the sender.
1718#[ derive( Debug , Serialize , Deserialize ) ]
18- pub ( super ) enum SizeMode {
19+ #[ serde( bound( serialize = "Codec: codec::Codec" ) ) ]
20+ #[ serde( bound( deserialize = "Codec: codec::Codec" ) ) ]
21+ pub ( super ) enum SizeMode < Codec > {
1922 /// Size is known (either upfront or after shutdown).
2023 Known ( u64 ) ,
2124 /// Size is unknown. Will send final byte count via oneshot on shutdown,
2225 /// then transition to Known.
23- Unknown ( oneshot:: Sender < u64 , crate :: codec :: Default > ) ,
26+ Unknown ( oneshot:: Sender < u64 , Codec > ) ,
2427}
2528
2629/// An I/O channel sender that implements [`AsyncWrite`].
2730///
2831/// Writes binary data to the underlying channel.
2932/// Tracks bytes written and enforces size limits if specified.
30- pub struct Sender {
33+ pub struct Sender < Codec = codec :: Default > {
3134 /// The underlying binary channel sender. Uses Mutex for serialization with &self.
3235 bin_sender : Mutex < Option < bin:: Sender > > ,
3336 /// Size handling mode.
34- size_mode : Mutex < SizeMode > ,
37+ size_mode : Mutex < SizeMode < Codec > > ,
3538 /// Total bytes written so far.
3639 bytes_written : u64 ,
3740 /// Cached chunk size from chmux sender.
@@ -42,7 +45,7 @@ pub struct Sender {
4245 sending : Option < ReusableBoxFuture < ' static , Result < ( bin:: Sender , u64 ) , io:: Error > > > ,
4346}
4447
45- impl fmt:: Debug for Sender {
48+ impl < Codec > fmt:: Debug for Sender < Codec > {
4649 fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
4750 f. debug_struct ( "Sender" )
4851 . field ( "expected_size" , & self . expected_size ( ) )
@@ -53,18 +56,20 @@ impl fmt::Debug for Sender {
5356
5457/// A sender in transport.
5558#[ derive( Debug , Serialize , Deserialize ) ]
56- pub ( crate ) struct TransportedSender {
59+ #[ serde( bound( serialize = "Codec: codec::Codec" ) ) ]
60+ #[ serde( bound( deserialize = "Codec: codec::Codec" ) ) ]
61+ pub ( crate ) struct TransportedSender < Codec > {
5762 /// The underlying binary sender. None if already closed.
5863 bin_sender : Option < bin:: Sender > ,
5964 /// Size handling mode.
60- size_mode : SizeMode ,
65+ size_mode : SizeMode < Codec > ,
6166 /// Total bytes written so far.
6267 bytes_written : u64 ,
6368}
6469
65- impl Sender {
70+ impl < Codec > Sender < Codec > {
6671 /// Creates a new sender.
67- pub ( super ) fn new ( bin_sender : bin:: Sender , size_mode : SizeMode ) -> Self {
72+ pub ( super ) fn new ( bin_sender : bin:: Sender , size_mode : SizeMode < Codec > ) -> Self {
6873 Self {
6974 bin_sender : Mutex :: new ( Some ( bin_sender) ) ,
7075 size_mode : Mutex :: new ( size_mode) ,
@@ -109,7 +114,7 @@ async fn connect_sender(mut bin_sender: bin::Sender) -> Result<(bin::Sender, usi
109114 Ok ( ( bin_sender, chunk_size) )
110115}
111116
112- impl Sender {
117+ impl < Codec > Sender < Codec > {
113118 /// Polls to complete any pending connect or send operations.
114119 fn poll_complete ( & mut self , cx : & mut Context < ' _ > ) -> Poll < io:: Result < ( ) > > {
115120 if let Some ( future) = & mut self . connecting {
@@ -154,7 +159,10 @@ impl Sender {
154159 }
155160}
156161
157- impl AsyncWrite for Sender {
162+ impl < Codec > AsyncWrite for Sender < Codec >
163+ where
164+ Codec : codec:: Codec ,
165+ {
158166 fn poll_write ( mut self : Pin < & mut Self > , cx : & mut Context < ' _ > , buf : & [ u8 ] ) -> Poll < io:: Result < usize > > {
159167 let this = self . as_mut ( ) . get_mut ( ) ;
160168
@@ -234,7 +242,10 @@ impl AsyncWrite for Sender {
234242 }
235243}
236244
237- impl Serialize for Sender {
245+ impl < Codec > Serialize for Sender < Codec >
246+ where
247+ Codec : codec:: Codec ,
248+ {
238249 fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
239250 where
240251 S : serde:: Serializer ,
@@ -245,16 +256,20 @@ impl Serialize for Sender {
245256 SizeMode :: Known ( 0 ) , // Placeholder, sender is consumed anyway
246257 ) ;
247258
248- TransportedSender { bin_sender, size_mode, bytes_written : self . bytes_written } . serialize ( serializer)
259+ TransportedSender :: < Codec > { bin_sender, size_mode, bytes_written : self . bytes_written }
260+ . serialize ( serializer)
249261 }
250262}
251263
252- impl < ' de > Deserialize < ' de > for Sender {
264+ impl < ' de , Codec > Deserialize < ' de > for Sender < Codec >
265+ where
266+ Codec : codec:: Codec ,
267+ {
253268 fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
254269 where
255270 D : serde:: Deserializer < ' de > ,
256271 {
257- let transported = TransportedSender :: deserialize ( deserializer) ?;
272+ let transported = TransportedSender :: < Codec > :: deserialize ( deserializer) ?;
258273
259274 Ok ( Self {
260275 bin_sender : Mutex :: new ( transported. bin_sender ) ,
0 commit comments