workflow_serializer/
payload.rs

1use crate::serializer::{Deserializer, Serializer};
2use crate::{load, store};
3use std::io::Cursor;
4
5pub mod ser {
6    use super::*;
7
8    #[repr(transparent)]
9    pub struct Payload<'a, T>(pub &'a T)
10    where
11        T: Serializer;
12
13    impl<'a, T> Serializer for Payload<'a, T>
14    where
15        T: Serializer,
16    {
17        fn serialize<W: std::io::Write>(&self, target: &mut W) -> std::io::Result<()> {
18            let mut payload = Vec::<u8>::new();
19            let mut writer = Cursor::new(&mut payload);
20            self.0.serialize(&mut writer)?;
21            store!(Vec<u8>, &payload, target)?;
22            Ok(())
23        }
24    }
25}
26
27pub mod de {
28    use super::*;
29
30    #[repr(transparent)]
31    pub struct Payload<T>(pub T)
32    where
33        T: Deserializer;
34
35    impl<T> Deserializer for Payload<T>
36    where
37        T: Deserializer,
38    {
39        fn deserialize<R: borsh::io::Read>(source: &mut R) -> std::io::Result<Self> {
40            let payload = load!(Vec::<u8>, source)?;
41            let mut reader = Cursor::new(payload);
42            let inner = T::deserialize(&mut reader)?;
43            Ok(Payload(inner))
44        }
45    }
46
47    impl<T> Payload<T>
48    where
49        T: Deserializer,
50    {
51        pub fn into_inner(self) -> T {
52            self.0
53        }
54    }
55}