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