tokio_serde_postcard/
lib.rs1use {
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}