tokio_serde_postcard/
lib.rs

1use {
2    bytes::{BufMut as _, Bytes, BytesMut},
3    serde::{Deserialize, Serialize},
4    std::{io, marker::PhantomData, pin::Pin},
5    tokio_serde::{Deserializer, Serializer},
6};
7
8pub struct Postcard<Item, SinkItem> {
9    _marker: PhantomData<(Item, SinkItem)>,
10}
11
12impl<Item, SinkItem> Default for Postcard<Item, SinkItem> {
13    fn default() -> Self {
14        Self::new()
15    }
16}
17
18impl<Item, SinkItem> Postcard<Item, SinkItem> {
19    pub fn new() -> Self {
20        Self {
21            _marker: PhantomData,
22        }
23    }
24}
25
26pub type SymmetricalPostcard<T> = Postcard<T, T>;
27
28impl<Item, SinkItem> Deserializer<Item> for Postcard<Item, SinkItem>
29where
30    for<'a> Item: Deserialize<'a>,
31{
32    type Error = io::Error;
33
34    fn deserialize(self: Pin<&mut Self>, src: &BytesMut) -> Result<Item, Self::Error> {
35        postcard::from_bytes(&src).map_err(|err| io::Error::new(io::ErrorKind::InvalidData, err))
36    }
37}
38
39impl<Item, SinkItem> Serializer<SinkItem> for Postcard<Item, SinkItem>
40where
41    SinkItem: Serialize,
42{
43    type Error = io::Error;
44
45    fn serialize(self: Pin<&mut Self>, data: &SinkItem) -> Result<Bytes, Self::Error> {
46        postcard::experimental::serialized_size(data)
47            .and_then(|size| postcard::to_io(data, BytesMut::with_capacity(size).writer()))
48            .map(|writer| writer.into_inner().freeze())
49            .map_err(|err| io::Error::new(io::ErrorKind::InvalidData, err))
50    }
51}