asynchronous_codec/codec/
bytes.rs

1use crate::{Decoder, Encoder};
2use bytes::{Bytes, BytesMut};
3use std::io::Error;
4
5/// A simple codec that ships bytes around
6///
7/// # Example
8///
9///  ```
10/// # futures::executor::block_on(async move {
11/// use bytes::Bytes;
12/// use futures::{SinkExt, TryStreamExt};
13/// use futures::io::Cursor;
14/// use asynchronous_codec::{BytesCodec, Framed};
15///
16/// let mut buf = vec![];
17/// // Cursor implements AsyncRead and AsyncWrite
18/// let cur = Cursor::new(&mut buf);
19/// let mut framed = Framed::new(cur, BytesCodec);
20///
21/// framed.send(Bytes::from("Hello World!")).await?;
22///
23/// while let Some(bytes) = framed.try_next().await? {
24///     dbg!(bytes);
25/// }
26/// # Ok::<_, std::io::Error>(())
27/// # }).unwrap();
28/// ```
29pub struct BytesCodec;
30
31impl Encoder for BytesCodec {
32    type Item = Bytes;
33    type Error = Error;
34
35    fn encode(&mut self, src: Self::Item, dst: &mut BytesMut) -> Result<(), Self::Error> {
36        dst.extend_from_slice(&src);
37        Ok(())
38    }
39}
40
41impl Decoder for BytesCodec {
42    type Item = Bytes;
43    type Error = Error;
44
45    fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
46        let len = src.len();
47        if len > 0 {
48            Ok(Some(src.split_to(len).freeze()))
49        } else {
50            Ok(None)
51        }
52    }
53}