cardano_serialization_lib/serialization/certificates/
move_instantaneous_rewards_cert.rs

1use crate::serialization::map_names::CertificateIndexNames;
2use crate::serialization::utils::{check_len, deserialize_and_check_index, is_break_tag, serialize_and_check_index};
3use crate::*;
4use num_traits::ToPrimitive;
5use hashlink::LinkedHashMap;
6
7impl cbor_event::se::Serialize for MIRToStakeCredentials {
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_map(cbor_event::Len::Len(self.rewards.len() as u64))?;
13        for (key, value) in &self.rewards {
14            key.serialize(serializer)?;
15            value.serialize(serializer)?;
16        }
17        Ok(serializer)
18    }
19}
20
21impl Deserialize for MIRToStakeCredentials {
22    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
23        (|| -> Result<_, DeserializeError> {
24            let mut table = LinkedHashMap::new();
25            let len = raw.map()?;
26            while match len {
27                cbor_event::Len::Len(n) => table.len() < n as usize,
28                cbor_event::Len::Indefinite => true,
29            } {
30                if is_break_tag(raw, "MIRToStakeCredentials")? {
31                    break;
32                }
33                let key = Credential::deserialize(raw)?;
34                let value = DeltaCoin::deserialize(raw)?;
35                if table.insert(key.clone(), value).is_some() {
36                    return Err(DeserializeFailure::DuplicateKey(Key::Str(format!(
37                        "StakeCred: {} (hex bytes)",
38                        hex::encode(key.to_bytes())
39                    )))
40                    .into());
41                }
42            }
43            Ok(Self { rewards: table })
44        })()
45        .map_err(|e| e.annotate("MIRToStakeCredentials"))
46    }
47}
48
49impl cbor_event::se::Serialize for MoveInstantaneousReward {
50    fn serialize<'se, W: Write>(
51        &self,
52        serializer: &'se mut Serializer<W>,
53    ) -> cbor_event::Result<&'se mut Serializer<W>> {
54        serializer.write_array(cbor_event::Len::Len(2))?;
55        match self.pot {
56            MIRPot::Reserves => serializer.write_unsigned_integer(0u64),
57            MIRPot::Treasury => serializer.write_unsigned_integer(1u64),
58        }?;
59        match &self.variant {
60            MIREnum::ToOtherPot(amount) => amount.serialize(serializer),
61            MIREnum::ToStakeCredentials(amounts) => amounts.serialize(serializer),
62        }
63    }
64}
65
66impl Deserialize for MoveInstantaneousReward {
67    fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
68        (|| -> Result<_, DeserializeError> {
69            let outer_len = raw.array()?;
70            let pot = match raw.unsigned_integer()? {
71                0 => MIRPot::Reserves,
72                1 => MIRPot::Treasury,
73                n => return Err(DeserializeFailure::UnknownKey(Key::Uint(n)).into()),
74            };
75            let variant = match raw.cbor_type()? {
76                CBORType::UnsignedInteger => MIREnum::ToOtherPot(Coin::deserialize(raw)?),
77                CBORType::Map => {
78                    MIREnum::ToStakeCredentials(MIRToStakeCredentials::deserialize(raw)?)
79                }
80                _ => return Err(DeserializeFailure::NoVariantMatched.into()),
81            };
82            match outer_len {
83                cbor_event::Len::Len(n) => {
84                    if n != 2 {
85                        return Err(DeserializeFailure::CBOR(cbor_event::Error::WrongLen(
86                            n,
87                            outer_len,
88                            "MoveInstantaneousReward",
89                        ))
90                        .into());
91                    }
92                }
93                cbor_event::Len::Indefinite => match raw.special()? {
94                    CBORSpecial::Break =>
95                    /* it's ok */
96                    {
97                        ()
98                    }
99                    _ => return Err(DeserializeFailure::EndingBreakMissing.into()),
100                },
101            };
102            Ok(Self { pot, variant })
103        })()
104        .map_err(|e| e.annotate("MoveInstantaneousReward"))
105    }
106}
107
108impl cbor_event::se::Serialize for MoveInstantaneousRewardsCert {
109    fn serialize<'se, W: Write>(
110        &self,
111        serializer: &'se mut Serializer<W>,
112    ) -> cbor_event::Result<&'se mut Serializer<W>> {
113        serializer.write_array(cbor_event::Len::Len(2))?;
114        self.serialize_as_embedded_group(serializer)
115    }
116}
117
118impl SerializeEmbeddedGroup for MoveInstantaneousRewardsCert {
119    fn serialize_as_embedded_group<'se, W: Write>(
120        &self,
121        serializer: &'se mut Serializer<W>,
122    ) -> cbor_event::Result<&'se mut Serializer<W>> {
123        let proposal_index = CertificateIndexNames::MoveInstantaneousRewardsCert.to_u64();
124        serialize_and_check_index(serializer, proposal_index, "MoveInstantaneousRewardsCert")?;
125
126        self.move_instantaneous_reward.serialize(serializer)?;
127        Ok(serializer)
128    }
129}
130
131impl_deserialize_for_wrapped_tuple!(MoveInstantaneousRewardsCert);
132
133impl DeserializeEmbeddedGroup for MoveInstantaneousRewardsCert {
134    fn deserialize_as_embedded_group<R: BufRead + Seek>(
135        raw: &mut Deserializer<R>,
136        len: cbor_event::Len,
137    ) -> Result<Self, DeserializeError> {
138        check_len(len, 2, "(cert_index, move_instantaneous_reward)")?;
139
140        let cert_index = CertificateIndexNames::MoveInstantaneousRewardsCert.to_u64();
141        deserialize_and_check_index(raw, cert_index, "cert_index")?;
142
143        let move_instantaneous_reward =
144            (|| -> Result<_, DeserializeError> { Ok(MoveInstantaneousReward::deserialize(raw)?) })(
145            )
146            .map_err(|e| e.annotate("move_instantaneous_reward"))?;
147        Ok(MoveInstantaneousRewardsCert {
148            move_instantaneous_reward,
149        })
150    }
151}