encode_decode/encode_decode.rs
1pub use binary_codec_sv2::{self, Decodable as Deserialize, Encodable as Serialize, *};
2use core::convert::TryInto;
3pub use derive_codec_sv2::{Decodable as Deserialize, Encodable as Serialize};
4
5// The `Test` struct is expanded using the `Deserialize` and `Serialize` procedural macros.
6// These macros provide the necessary methods for serializing and deserializing the struct.
7//
8// mod impl_parse_decodable_test {
9// use super::binary_codec_sv2::{
10// decodable::DecodableField, decodable::FieldMarker, Decodable, Error, SizeHint,
11// };
12// use super::*;
13// impl<'decoder> Decodable<'decoder> for Test {
14// fn get_structure(data: &[u8]) -> Result<Vec<FieldMarker>, Error> {
15// let mut fields = Vec::new();
16// let mut offset = 0;
17// let a: Vec<FieldMarker> = u32::get_structure(&data[offset..])?;
18// offset += a.size_hint_(&data, offset)?;
19// let a = a.try_into()?;
20// fields.push(a);
21// let b: Vec<FieldMarker> = u8::get_structure(&data[offset..])?;
22// offset += b.size_hint_(&data, offset)?;
23// let b = b.try_into()?;
24// fields.push(b);
25// let c: Vec<FieldMarker> = U24::get_structure(&data[offset..])?;
26// offset += c.size_hint_(&data, offset)?;
27// let c = c.try_into()?;
28// fields.push(c);
29// Ok(fields)
30// }
31// fn from_decoded_fields(
32// mut data: Vec<DecodableField<'decoder>>,
33// ) -> Result<Self, Error> {
34// Ok(Self {
35// c: U24::from_decoded_fields(
36// data.pop().ok_or(Error::NoDecodableFieldPassed)?.into(),
37// )?,
38// b: u8::from_decoded_fields(
39// data.pop().ok_or(Error::NoDecodableFieldPassed)?.into(),
40// )?,
41// a: u32::from_decoded_fields(
42// data.pop().ok_or(Error::NoDecodableFieldPassed)?.into(),
43// )?,
44// })
45// }
46// }
47// impl<'decoder> Test {
48// pub fn into_static(self) -> Test {
49// Test {
50// a: self.a.clone(),
51// b: self.b.clone(),
52// c: self.c.clone(),
53// }
54// }
55// }
56// impl<'decoder> Test {
57// pub fn as_static(&self) -> Test {
58// Test {
59// a: self.a.clone(),
60// b: self.b.clone(),
61// c: self.c.clone(),
62// }
63// }
64// }
65// }
66// mod impl_parse_encodable_test {
67// use super::binary_codec_sv2::{encodable::EncodableField, GetSize};
68// use super::Test;
69// extern crate alloc;
70// use alloc::vec::Vec;
71// impl<'decoder> From<Test> for EncodableField<'decoder> {
72// fn from(v: Test) -> Self {
73// let mut fields: Vec<EncodableField> = Vec::new();
74// let val = v.a;
75// fields.push(val.into());
76// let val = v.b;
77// fields.push(val.into());
78// let val = v.c;
79// fields.push(val.into());
80// Self::Struct(fields)
81// }
82// }
83// impl<'decoder> GetSize for Test {
84// fn get_size(&self) -> usize {
85// let mut size = 0;
86// size += self.a.get_size();
87// size += self.b.get_size();
88// size += self.c.get_size();
89// size
90// }
91// }
92// }
93//
94
95#[derive(Clone, Deserialize, Serialize, PartialEq, Debug)]
96struct Test {
97 a: u32,
98 b: u8,
99 c: U24,
100}
101
102fn main() {
103 let expected = Test {
104 a: 456,
105 b: 9,
106 c: 67_u32.try_into().unwrap(),
107 };
108
109 // `to_bytes` serves as the entry point to the `binary_sv2` crate. It acts as a serializer that
110 // converts the struct into bytes.
111 let mut bytes = to_bytes(expected.clone()).unwrap();
112
113 // `from_bytes` is a deserializer that interprets the bytes and reconstructs the original
114 // struct.
115 let deserialized: Test = from_bytes(&mut bytes[..]).unwrap();
116
117 assert_eq!(deserialized, expected);
118}