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}