1 use crate::codec::decoder::Decoder; 2 use crate::codec::encoder::Encoder; 3 4 use bytes::{BufMut, Bytes, BytesMut}; 5 use std::io; 6 7 /// A simple [`Decoder`] and [`Encoder`] implementation that just ships bytes around. 8 /// 9 /// [`Decoder`]: crate::codec::Decoder 10 /// [`Encoder`]: crate::codec::Encoder 11 /// 12 /// # Example 13 /// 14 /// Turn an [`AsyncRead`] into a stream of `Result<`[`BytesMut`]`, `[`Error`]`>`. 15 /// 16 /// [`AsyncRead`]: tokio::io::AsyncRead 17 /// [`BytesMut`]: bytes::BytesMut 18 /// [`Error`]: std::io::Error 19 /// 20 /// ``` 21 /// # mod hidden { 22 /// # #[allow(unused_imports)] 23 /// use tokio::fs::File; 24 /// # } 25 /// use tokio::io::AsyncRead; 26 /// use tokio_util::codec::{FramedRead, BytesCodec}; 27 /// 28 /// # enum File {} 29 /// # impl File { 30 /// # async fn open(_name: &str) -> Result<impl AsyncRead, std::io::Error> { 31 /// # use std::io::Cursor; 32 /// # Ok(Cursor::new(vec![0, 1, 2, 3, 4, 5])) 33 /// # } 34 /// # } 35 /// # 36 /// # #[tokio::main(flavor = "current_thread")] 37 /// # async fn main() -> Result<(), std::io::Error> { 38 /// let my_async_read = File::open("filename.txt").await?; 39 /// let my_stream_of_bytes = FramedRead::new(my_async_read, BytesCodec::new()); 40 /// # Ok(()) 41 /// # } 42 /// ``` 43 /// 44 #[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Default)] 45 pub struct BytesCodec(()); 46 47 impl BytesCodec { 48 /// Creates a new `BytesCodec` for shipping around raw bytes. new() -> BytesCodec49 pub fn new() -> BytesCodec { 50 BytesCodec(()) 51 } 52 } 53 54 impl Decoder for BytesCodec { 55 type Item = BytesMut; 56 type Error = io::Error; 57 decode(&mut self, buf: &mut BytesMut) -> Result<Option<BytesMut>, io::Error>58 fn decode(&mut self, buf: &mut BytesMut) -> Result<Option<BytesMut>, io::Error> { 59 if !buf.is_empty() { 60 let len = buf.len(); 61 Ok(Some(buf.split_to(len))) 62 } else { 63 Ok(None) 64 } 65 } 66 } 67 68 impl Encoder<Bytes> for BytesCodec { 69 type Error = io::Error; 70 encode(&mut self, data: Bytes, buf: &mut BytesMut) -> Result<(), io::Error>71 fn encode(&mut self, data: Bytes, buf: &mut BytesMut) -> Result<(), io::Error> { 72 buf.reserve(data.len()); 73 buf.put(data); 74 Ok(()) 75 } 76 } 77 78 impl Encoder<BytesMut> for BytesCodec { 79 type Error = io::Error; 80 encode(&mut self, data: BytesMut, buf: &mut BytesMut) -> Result<(), io::Error>81 fn encode(&mut self, data: BytesMut, buf: &mut BytesMut) -> Result<(), io::Error> { 82 buf.reserve(data.len()); 83 buf.put(data); 84 Ok(()) 85 } 86 } 87