diff --git a/tokio-util/src/codec/decoder.rs b/tokio-util/src/codec/decoder.rs index 84ecb2297ab..280f7223776 100644 --- a/tokio-util/src/codec/decoder.rs +++ b/tokio-util/src/codec/decoder.rs @@ -182,3 +182,13 @@ pub trait Decoder { Framed::new(io, self) } } + +impl Decoder for &mut T { + type Item = T::Item; + + type Error = T::Error; + + fn decode(&mut self, src: &mut BytesMut) -> Result, Self::Error> { + (**self).decode(src) + } +} \ No newline at end of file diff --git a/tokio-util/src/codec/encoder.rs b/tokio-util/src/codec/encoder.rs index 770a10fa9b5..a5ef34ac7ef 100644 --- a/tokio-util/src/codec/encoder.rs +++ b/tokio-util/src/codec/encoder.rs @@ -23,3 +23,11 @@ pub trait Encoder { /// [`FramedWrite`]: crate::codec::FramedWrite fn encode(&mut self, item: Item, dst: &mut BytesMut) -> Result<(), Self::Error>; } + +impl> Encoder for &mut T { + type Error = T::Error; + + fn encode(&mut self, item: I, dst: &mut BytesMut) -> Result<(), Self::Error> { + (**self).encode(item, dst) + } +} diff --git a/tokio-util/tests/framed_write.rs b/tokio-util/tests/framed_write.rs index 32b2486791f..df75237cee7 100644 --- a/tokio-util/tests/framed_write.rs +++ b/tokio-util/tests/framed_write.rs @@ -116,7 +116,8 @@ fn borrow_framed_write() { assert!(assert_ready!(pin!(framed).poll_ready(cx)).is_ok()); assert!(pin!(framed).start_send(0x04).is_ok()); - let mut borrow_framed = framed.with_encoder(|_| U64Encoder); + let mut new_codec = U64Encoder; + let mut borrow_framed = framed.with_encoder(|_| &mut new_codec); assert!(assert_ready!(pin!(borrow_framed).poll_ready(cx)).is_ok()); assert!(pin!(borrow_framed).start_send(0x08).is_ok());