cardano_serialization_lib/serialization/crypto/
vkeys.rs1use std::io::{BufRead, Seek, Write};
2use cbor_event::de::Deserializer;
3use cbor_event::se::Serializer;
4use crate::{DeserializeError, Vkey, Vkeys};
5use crate::protocol_types::Deserialize;
6use crate::serialization::utils::is_break_tag;
7
8impl cbor_event::se::Serialize for Vkeys {
9 fn serialize<'se, W: Write>(
10 &self,
11 serializer: &'se mut Serializer<W>,
12 ) -> cbor_event::Result<&'se mut Serializer<W>> {
13 serializer.write_array(cbor_event::Len::Len(self.0.len() as u64))?;
14 for element in &self.0 {
15 element.serialize(serializer)?;
16 }
17 Ok(serializer)
18 }
19}
20
21impl Deserialize for Vkeys {
22 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
23 let mut arr = Vec::new();
24 (|| -> Result<_, DeserializeError> {
25 let len = raw.array()?;
26 while match len {
27 cbor_event::Len::Len(n) => arr.len() < n as usize,
28 cbor_event::Len::Indefinite => true,
29 } {
30 if is_break_tag(raw, "Vkeys")? {
31 break;
32 }
33 arr.push(Vkey::deserialize(raw)?);
34 }
35 Ok(())
36 })()
37 .map_err(|e| e.annotate("Vkeys"))?;
38 Ok(Self(arr))
39 }
40}