dencode/codec/
bytes.rs

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