cardano_serialization_lib/serialization/crypto/
vkeys.rs

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