cardano_serialization_lib/serialization/witnesses/
vkeywitness.rs

1use std::io::{BufRead, Seek, Write};
2use cbor_event::de::Deserializer;
3use cbor_event::se::Serializer;
4use crate::protocol_types::Deserialize;
5use crate::{DeserializeError, DeserializeFailure, Ed25519Signature, Vkey, Vkeywitness};
6
7impl cbor_event::se::Serialize for Vkeywitness {
8    fn serialize<'se, W: Write>(
9        &self,
10        serializer: &'se mut Serializer<W>,
11    ) -> cbor_event::Result<&'se mut Serializer<W>> {
12        serializer.write_array(cbor_event::Len::Len(2))?;
13        self.vkey.serialize(serializer)?;
14        self.signature.serialize(serializer)
15    }
16}
17
18impl Deserialize for Vkeywitness {
19    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
20        (|| -> Result<_, DeserializeError> {
21            let len = raw.array()?;
22            let vkey = (|| -> Result<_, DeserializeError> { Ok(Vkey::deserialize(raw)?) })()
23                .map_err(|e| e.annotate("vkey"))?;
24            let signature =
25                (|| -> Result<_, DeserializeError> { Ok(Ed25519Signature::deserialize(raw)?) })()
26                    .map_err(|e| e.annotate("signature"))?;
27            let ret = Ok(Vkeywitness::new(&vkey, &signature));
28            match len {
29                cbor_event::Len::Len(n) => match n {
30                    2 => (),
31                    _ => {
32                        return Err(DeserializeFailure::CBOR(cbor_event::Error::WrongLen(
33                            2, len, "",
34                        ))
35                            .into())
36                    }
37                },
38                cbor_event::Len::Indefinite => match raw.special()? {
39                    cbor_event::Special::Break =>
40                    /* it's ok */
41                        {
42                            ()
43                        }
44                    _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
45                },
46            }
47            ret
48        })()
49            .map_err(|e| e.annotate("Vkeywitness"))
50    }
51}