Skip to main content

workflow_serializer/
macros.rs

1//!
2//! Macros for loading and storing items using Borsh and Serializer.
3//!
4
5/// Create Payload struct - a `#repr[transparent]` struct
6/// wrapping `Cursor<Vec<u8>>`. This struct acts as a helper
7/// for storing and loading items into a `Vec<u8>` buffer.
8#[macro_export]
9macro_rules! payload {
10    () => {{ $crate::payload::Payload::default() }};
11    ($value:expr_2021) => {{ $crate::payload::Payload::with_capacity($value) }};
12}
13
14/// Construct a `crate::payload::Version` from major and minor version numbers.
15#[macro_export]
16macro_rules! version {
17    ($major:expr_2021, $minor:expr_2021) => {{ $crate::payload::Version::new($major, $minor) }};
18}
19
20/// Borrow a `crate::payload::Payload` as a mutable `Cursor<Vec<u8>>` writer.
21#[macro_export]
22macro_rules! writer {
23    ($value:expr_2021) => {{ ($value.as_mut() as &mut std::io::Cursor<Vec<u8>>) }};
24}
25
26/// Consume a `crate::payload::Payload` and produce a `Cursor<Vec<u8>>` reader over its bytes.
27#[macro_export]
28macro_rules! reader {
29    ($value:expr_2021) => {{ &mut std::io::Cursor::new($value.into_inner()) }};
30}
31
32/// Store item using Borsh serialization
33#[macro_export]
34macro_rules! store {
35    ($type:ty, $value:expr_2021, $writer:expr_2021) => {
36        <$type as borsh::BorshSerialize>::serialize($value, $writer)
37    };
38}
39
40/// Load item using Borsh deserialization
41#[macro_export]
42macro_rules! load {
43    ($type:ty, $reader:expr_2021) => {
44        <$type as borsh::BorshDeserialize>::deserialize_reader($reader)
45    };
46}
47
48/// Store item using Serializer serialization. [`crate::serializer::Serializer`] is meant to provide
49/// custom serialization over Borsh that can be used to store additional
50/// metadata such as struct version.
51#[macro_export]
52macro_rules! serialize {
53    ($type:ty, $value:expr_2021, $writer:expr_2021) => {
54        $crate::payload::ser::Payload::<$type>($value).serialize($writer)
55    };
56}
57
58/// Load item using Serializer deserialization. [`crate::serializer::Serializer`] is meant to provide
59/// custom serialization over Borsh that can be used to store additional
60/// metadata such as struct version.
61#[macro_export]
62macro_rules! deserialize {
63    ($type:ty, $reader:expr_2021) => {
64        $crate::payload::de::Payload::<$type>::deserialize($reader).map(|x| x.into_inner())
65    };
66}