cardano_serialization_lib/serialization/governance/
drep.rs1use crate::*;
2
3impl cbor_event::se::Serialize for DRep {
4 fn serialize<'se, W: Write>(
5 &self,
6 serializer: &'se mut Serializer<W>,
7 ) -> cbor_event::Result<&'se mut Serializer<W>> {
8 self.0.serialize(serializer)
9 }
10}
11
12impl Deserialize for DRep {
13 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
14 (|| -> Result<_, DeserializeError> {
15 let drep_enum = DRepEnum::deserialize(raw)?;
16 Ok(Self(drep_enum))
17 })()
18 .map_err(|e| e.annotate("DRep"))
19 }
20}
21
22impl cbor_event::se::Serialize for DRepEnum {
23 fn serialize<'se, W: Write>(
24 &self,
25 serializer: &'se mut Serializer<W>,
26 ) -> cbor_event::Result<&'se mut Serializer<W>> {
27 match &self {
28 DRepEnum::KeyHash(keyhash) => {
29 serializer.write_array(cbor_event::Len::Len(2))?;
30 serializer.write_unsigned_integer(0u64)?;
31 serializer.write_bytes(keyhash.to_bytes())
32 }
33 DRepEnum::ScriptHash(scripthash) => {
34 serializer.write_array(cbor_event::Len::Len(2))?;
35 serializer.write_unsigned_integer(1u64)?;
36 serializer.write_bytes(scripthash.to_bytes())
37 }
38 DRepEnum::AlwaysAbstain => {
39 serializer.write_array(cbor_event::Len::Len(1))?;
40 serializer.write_unsigned_integer(2u64)
41 }
42 DRepEnum::AlwaysNoConfidence => {
43 serializer.write_array(cbor_event::Len::Len(1))?;
44 serializer.write_unsigned_integer(3u64)
45 }
46 }
47 }
48}
49
50impl Deserialize for DRepEnum {
51 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
52 (|| -> Result<_, DeserializeError> {
53 let len = raw.array()?;
54 if let cbor_event::Len::Len(n) = len {
55 if n != 2 && n != 1 {
56 return Err(DeserializeFailure::CBOR(cbor_event::Error::WrongLen(
57 2,
58 len,
59 "[id, hash] or [id] (for abstain and no confidence)",
60 ))
61 .into());
62 }
63 }
64
65 let drep = match raw.unsigned_integer()? {
66 0 => {
67 let key_hash =
68 Ed25519KeyHash::deserialize(raw).map_err(|e| e.annotate("key_hash"))?;
69 DRepEnum::KeyHash(key_hash)
70 }
71 1 => {
72 let script_hash =
73 ScriptHash::deserialize(raw).map_err(|e| e.annotate("script_hash"))?;
74 DRepEnum::ScriptHash(script_hash)
75 }
76 2 => DRepEnum::AlwaysAbstain,
77 3 => DRepEnum::AlwaysNoConfidence,
78 n => {
79 return Err(DeserializeFailure::FixedValuesMismatch {
80 found: Key::Uint(n),
81 expected: vec![Key::Uint(0), Key::Uint(1), Key::Uint(2), Key::Uint(3)],
82 }
83 .into())
84 }
85 };
86 if let cbor_event::Len::Indefinite = len {
87 if raw.special()? != CBORSpecial::Break {
88 return Err(DeserializeFailure::EndingBreakMissing.into());
89 }
90 }
91 Ok(drep)
92 })()
93 .map_err(|e| e.annotate("DRepEnum"))
94 }
95}