cardano_serialization_lib/serialization/certificates/
move_instantaneous_rewards_cert.rs1use 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 {
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}