catbuffer_rust/
aggregate_transaction_body_builder.rs1use super::cosignature_builder::*;
23use super::embedded_transaction_builder::*;
24use super::embedded_transaction_helper::*;
25use super::generator_utils::*;
26use super::hash256_dto::*;
27
28#[derive(Debug, Clone)]
30pub struct AggregateTransactionBodyBuilder {
31 pub transactions_hash: Hash256Dto,
33 pub transactions: Vec<Box<dyn EmbeddedTransactionHelper + 'static>>,
35 pub cosignatures: Vec<CosignatureBuilder>,
37}
38
39impl AggregateTransactionBodyBuilder {
40 fn load_embedded_transactions(transactions: &mut Vec<Box<dyn EmbeddedTransactionHelper + 'static>>, mut payload: Vec<u8>, payload_size: u32) -> Vec<u8> {
41 let mut remaining_byte_sizes = payload_size as usize;
42 while remaining_byte_sizes > 0 {
43 let item = load_from_binary(&payload);
44 transactions.push(item.clone());
45 let size = item.get_size();
46 let item_size = size + Self::get_padding_size(item.get_size(), 8);
47 remaining_byte_sizes -= item_size;
48 payload = (&payload[item_size..]).to_vec();
49 }
50 payload
51 }
52
53 fn load_cosignatures(transactions: &mut Vec<CosignatureBuilder>, mut payload: Vec<u8>, payload_size: usize) -> Vec<u8> {
54 let mut remaining_byte_sizes = payload_size;
55 while remaining_byte_sizes > 0 {
56 let item = CosignatureBuilder::from_binary(&payload);
57 transactions.push(item.clone());
58 let size = item.get_size();
59 let item_size = size + Self::get_padding_size(item.get_size(), 8);
60 remaining_byte_sizes -= item_size;
61 payload = (&payload[item_size..]).to_vec();
62 }
63 payload
64 }
65
66 pub fn from_binary(payload: &[u8]) -> Self {
71 let mut _bytes = payload.to_vec();
72 let transactions_hash = Hash256Dto::from_binary(&_bytes); _bytes = _bytes[transactions_hash.get_size()..].to_vec();
74 let buf = fixed_bytes::<4>(&_bytes);
75 let payload_size = u32::from_le_bytes(buf); _bytes = (&_bytes[4..]).to_vec();
77 let buf = fixed_bytes::<4>(&_bytes);
78 let _ = u32::from_le_bytes(buf); _bytes = (&_bytes[4..]).to_vec();
80 let mut transactions: Vec<Box<dyn EmbeddedTransactionHelper + 'static>> = vec![];
81 _bytes = AggregateTransactionBodyBuilder::load_embedded_transactions(&mut transactions, _bytes, payload_size);
82 let mut cosignatures: Vec<CosignatureBuilder> = vec![];
83 let _ = Self::load_cosignatures(&mut cosignatures, _bytes.clone(), _bytes.clone().len());
84 AggregateTransactionBodyBuilder { transactions_hash, transactions, cosignatures } }
87
88 pub fn serialize_aligned(transaction: &Box<dyn EmbeddedTransactionHelper>) -> Vec<u8> {
92 let txn_bytes = transaction.serializer();
93 let padding = vec![0u8; Self::get_padding_size(txn_bytes.len(), 8)];
94 [txn_bytes, padding].concat()
95 }
96
97 pub fn size_aligned(transaction: &Box<dyn EmbeddedTransactionHelper>) -> usize {
101 let txn_size = transaction.get_size();
102 let padding_size = Self::get_padding_size(txn_size, 8);
103 txn_size + padding_size
104 }
105
106 fn get_padding_size(size: usize, alignment: usize) -> usize {
107 if alignment == 0 {
108 return 0;
109 }
110
111 if size % alignment == 0 {
112 return 0;
113 }
114 alignment - size % alignment
115 }
116 pub fn get_size(&self) -> usize {
121 let mut size = 0;
122 size += self.transactions_hash.get_size(); size += 4; size += 4; for i in &self.transactions {
126 size += Self::size_aligned(i); };
128 for i in &self.cosignatures {
129 size += i.get_size(); };
131 size
132 }
133
134 pub fn serializer(&self) -> Vec<u8> {
139 let mut buf: Vec<u8> = vec![];
140 buf.append(&mut self.transactions_hash.serializer()); let mut size_value: u32 = 0;
143 for i in &self.transactions {
144 size_value += Self::size_aligned(i) as u32;
145 };
146 buf.append(&mut size_value.to_le_bytes().to_vec()); buf.append(&mut [0u8; 4].to_vec()); for i in &self.transactions {
149 buf.append(&mut Self::serialize_aligned(i)); }
151 for i in &self.cosignatures {
152 buf.append(&mut i.serializer()); }
154 buf
155 }
156}
157