Skip to main content

workflow_serializer/
payload.rs

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