cardano_serialization_lib/serialization/witnesses/
vkeywitnesses.rs1use std::io::{BufRead, Seek, Write};
2use cbor_event::de::Deserializer;
3use cbor_event::se::Serializer;
4use crate::protocol_types::Deserialize;
5use crate::{CborSetType, DeserializeError, Vkeywitness, Vkeywitnesses};
6use crate::serialization::utils::skip_set_tag;
7
8impl cbor_event::se::Serialize for Vkeywitnesses {
9 fn serialize<'se, W: Write>(
10 &self,
11 serializer: &'se mut Serializer<W>,
12 ) -> cbor_event::Result<&'se mut Serializer<W>> {
13 if self.force_original_cbor_set_type() {
14 if self.get_set_type() == CborSetType::Tagged {
15 serializer.write_tag(258)?;
16 }
17 } else {
18 serializer.write_tag(258)?;
19 }
20 serializer.write_array(cbor_event::Len::Len(self.len() as u64))?;
21 for element in self {
22 element.serialize(serializer)?;
23 }
24 Ok(serializer)
25 }
26}
27
28impl Deserialize for Vkeywitnesses {
29 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
30 let has_set_tag = skip_set_tag(raw)?;
31 let mut wits = Vkeywitnesses::new();
32 let mut total = 0u64;
33 (|| -> Result<_, DeserializeError> {
34 skip_set_tag(raw)?;
35 let len = raw.array()?;
36 while match len {
37 cbor_event::Len::Len(n) => total < n,
38 cbor_event::Len::Indefinite => true,
39 } {
40 if raw.cbor_type()? == cbor_event::Type::Special {
41 assert_eq!(raw.special()?, cbor_event::Special::Break);
42 break;
43 }
44 wits.add_move(Vkeywitness::deserialize(raw)?);
45 total += 1;
46 }
47 Ok(())
48 })()
49 .map_err(|e| e.annotate("Vkeywitnesses"))?;
50
51 if has_set_tag {
52 wits.set_set_type(CborSetType::Tagged);
53 } else {
54 wits.set_set_type(CborSetType::Untagged);
55 }
56 Ok(wits)
57 }
58}