cardano_serialization_lib/serialization/block/
block.rs

1use 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}