| 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. |
| 49 | pub fn new() -> BytesCodec { |
| 50 | BytesCodec(()) |
| 51 | } |
| 52 | } |
| 53 | |
| 54 | impl Decoder for BytesCodec { |
| 55 | type Item = BytesMut; |
| 56 | type Error = io::Error; |
| 57 | |
| 58 | fn decode(&mut self, buf: &mut BytesMut) -> Result<Option<BytesMut>, io::Error> { |
| 59 | if !buf.is_empty() { |
| 60 | let len: usize = buf.len(); |
| 61 | Ok(Some(buf.split_to(at:len))) |
| 62 | } else { |
| 63 | Ok(None) |
| 64 | } |
| 65 | } |
| 66 | } |
| 67 | |
| 68 | impl Encoder<Bytes> for BytesCodec { |
| 69 | type Error = io::Error; |
| 70 | |
| 71 | fn encode(&mut self, data: Bytes, buf: &mut BytesMut) -> Result<(), io::Error> { |
| 72 | buf.reserve(additional:data.len()); |
| 73 | buf.put(src:data); |
| 74 | Ok(()) |
| 75 | } |
| 76 | } |
| 77 | |
| 78 | impl Encoder<BytesMut> for BytesCodec { |
| 79 | type Error = io::Error; |
| 80 | |
| 81 | fn encode(&mut self, data: BytesMut, buf: &mut BytesMut) -> Result<(), io::Error> { |
| 82 | buf.reserve(additional:data.len()); |
| 83 | buf.put(src:data); |
| 84 | Ok(()) |
| 85 | } |
| 86 | } |
| 87 | |