cardano_serialization_lib/serialization/block/
block.rs1use crate::*;
2use crate::serialization::utils::is_break_tag;
3
4impl cbor_event::se::Serialize for Block {
5 fn serialize<'se, W: Write>(
6 &self,
7 serializer: &'se mut Serializer<W>,
8 ) -> cbor_event::Result<&'se mut Serializer<W>> {
9 serializer.write_array(cbor_event::Len::Len(5))?;
10 self.header.serialize(serializer)?;
11 self.transaction_bodies.serialize(serializer)?;
12 self.transaction_witness_sets.serialize(serializer)?;
13 self.auxiliary_data_set.serialize(serializer)?;
14 serializer.write_array(cbor_event::Len::Len(self.invalid_transactions.len() as u64))?;
15 for element in self.invalid_transactions.iter() {
16 element.serialize(serializer)?;
17 }
18 Ok(serializer)
19 }
20}
21
22impl Deserialize for Block {
23 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
24 (|| -> Result<_, DeserializeError> {
25 let len = raw.array()?;
26 let mut read_len = CBORReadLen::new(len);
27 read_len.read_elems(4)?;
28 let header = (|| -> Result<_, DeserializeError> { Ok(Header::deserialize(raw)?) })()
29 .map_err(|e| e.annotate("header"))?;
30 let transaction_bodies =
31 (|| -> Result<_, DeserializeError> { Ok(TransactionBodies::deserialize(raw)?) })()
32 .map_err(|e| e.annotate("transaction_bodies"))?;
33 let transaction_witness_sets = (|| -> Result<_, DeserializeError> {
34 Ok(TransactionWitnessSets::deserialize(raw)?)
35 })()
36 .map_err(|e| e.annotate("transaction_witness_sets"))?;
37 let auxiliary_data_set =
38 (|| -> Result<_, DeserializeError> { Ok(AuxiliaryDataSet::deserialize(raw)?) })()
39 .map_err(|e| e.annotate("auxiliary_data_set"))?;
40 let invalid_present = match len {
41 cbor_event::Len::Indefinite => raw.cbor_type()? == CBORType::Array,
42 cbor_event::Len::Len(4) => false,
43 _ => true,
44 };
45 let invalid_transactions = (|| -> Result<_, DeserializeError> {
46 let mut arr = Vec::new();
47 if invalid_present {
48 read_len.read_elems(1)?;
49 let len = raw.array()?;
50 while match len {
51 cbor_event::Len::Len(n) => arr.len() < n as usize,
52 cbor_event::Len::Indefinite => true,
53 } {
54 if is_break_tag(raw, "Block.invalid_transactions")? {
55 break;
56 }
57 arr.push(TransactionIndex::deserialize(raw)?);
58 }
59 }
60 Ok(arr)
61 })()
62 .map_err(|e| e.annotate("invalid_transactions"))?;
63 match len {
64 cbor_event::Len::Len(_) => (),
65 cbor_event::Len::Indefinite => match raw.special()? {
66 CBORSpecial::Break => (),
67 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
68 },
69 }
70 Ok(Block {
71 header,
72 transaction_bodies,
73 transaction_witness_sets,
74 auxiliary_data_set,
75 invalid_transactions,
76 })
77 })()
78 .map_err(|e| e.annotate("Block"))
79 }
80}