cardano_serialization_lib/serialization/governance/
voter.rs

1use crate::*;
2
3impl cbor_event::se::Serialize for Voter {
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 Voter {
13    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
14        (|| -> Result<_, DeserializeError> {
15            let voter_enum = VoterEnum::deserialize(raw)?;
16            Ok(Self(voter_enum))
17        })()
18        .map_err(|e| e.annotate("Voter"))
19    }
20}
21
22impl cbor_event::se::Serialize for VoterEnum {
23    fn serialize<'se, W: Write>(
24        &self,
25        serializer: &'se mut Serializer<W>,
26    ) -> cbor_event::Result<&'se mut Serializer<W>> {
27        serializer.write_array(cbor_event::Len::Len(2))?;
28        match &self {
29            VoterEnum::ConstitutionalCommitteeHotCred(cred) => match &cred.0 {
30                CredType::Key(key_hash) => {
31                    serializer.write_unsigned_integer(0u64)?;
32                    key_hash.serialize(serializer)?;
33                }
34                CredType::Script(script_hash) => {
35                    serializer.write_unsigned_integer(1u64)?;
36                    script_hash.serialize(serializer)?;
37                }
38            },
39            VoterEnum::DRep(cred) => match &cred.0 {
40                CredType::Key(key_hash) => {
41                    serializer.write_unsigned_integer(2u64)?;
42                    key_hash.serialize(serializer)?;
43                }
44                CredType::Script(script_hash) => {
45                    serializer.write_unsigned_integer(3u64)?;
46                    script_hash.serialize(serializer)?;
47                }
48            },
49            VoterEnum::StakingPool(scripthash) => {
50                serializer.write_unsigned_integer(4u64)?;
51                scripthash.serialize(serializer)?;
52            }
53        };
54        Ok(serializer)
55    }
56}
57
58impl Deserialize for VoterEnum {
59    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
60        (|| -> Result<_, DeserializeError> {
61            let len = raw.array()?;
62            if let cbor_event::Len::Len(n) = len {
63                if n != 2 {
64                    return Err(DeserializeFailure::CBOR(cbor_event::Error::WrongLen(
65                        2,
66                        len,
67                        "[id, hash]",
68                    ))
69                    .into());
70                }
71            }
72            let voter = match raw.unsigned_integer()? {
73                0 => VoterEnum::ConstitutionalCommitteeHotCred(Credential(CredType::Key(
74                    Ed25519KeyHash::deserialize(raw)?,
75                ))),
76                1 => VoterEnum::ConstitutionalCommitteeHotCred(Credential(CredType::Script(
77                    ScriptHash::deserialize(raw)?,
78                ))),
79                2 => VoterEnum::DRep(Credential(CredType::Key(Ed25519KeyHash::deserialize(
80                    raw,
81                )?))),
82                3 => VoterEnum::DRep(Credential(CredType::Script(ScriptHash::deserialize(
83                    raw,
84                )?))),
85                4 => VoterEnum::StakingPool(Ed25519KeyHash::deserialize(raw)?),
86                n => {
87                    return Err(DeserializeFailure::FixedValuesMismatch {
88                        found: Key::Uint(n),
89                        expected: vec![
90                            Key::Uint(0),
91                            Key::Uint(1),
92                            Key::Uint(2),
93                            Key::Uint(3),
94                            Key::Uint(4),
95                        ],
96                    }
97                    .into())
98                }
99            };
100            if let cbor_event::Len::Indefinite = len {
101                if raw.special()? != CBORSpecial::Break {
102                    return Err(DeserializeFailure::EndingBreakMissing.into());
103                }
104            }
105            Ok(voter)
106        })()
107        .map_err(|e| e.annotate("VoterEnum"))
108    }
109}