cardano_serialization_lib/serialization/governance/
drep.rs

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