cardano_serialization_lib/serialization/witnesses/
vkeywitness.rs1use 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 {
42 ()
43 }
44 _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
45 },
46 }
47 ret
48 })()
49 .map_err(|e| e.annotate("Vkeywitness"))
50 }
51}