cardano_serialization_lib/serialization/governance/proposals/
governance_action.rs1use crate::serialization::map_names::VotingProposalIndexNames;
2use crate::serialization::utils::check_len_indefinite;
3use crate::*;
4use num_traits::FromPrimitive;
5use std::io::{Seek, SeekFrom};
6
7impl Serialize for GovernanceAction {
8 fn serialize<'se, W: Write>(
9 &self,
10 serializer: &'se mut Serializer<W>,
11 ) -> cbor_event::Result<&'se mut Serializer<W>> {
12 match &self.0 {
13 GovernanceActionEnum::ParameterChangeAction(x) => x.serialize(serializer),
14 GovernanceActionEnum::HardForkInitiationAction(x) => x.serialize(serializer),
15 GovernanceActionEnum::TreasuryWithdrawalsAction(x) => x.serialize(serializer),
16 GovernanceActionEnum::NoConfidenceAction(x) => x.serialize(serializer),
17 GovernanceActionEnum::UpdateCommitteeAction(x) => x.serialize(serializer),
18 GovernanceActionEnum::NewConstitutionAction(x) => x.serialize(serializer),
19 GovernanceActionEnum::InfoAction(x) => x.serialize(serializer),
20 }
21 }
22}
23
24impl Deserialize for GovernanceAction {
25 fn deserialize<R: BufRead + Seek>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
26 (|| -> Result<_, DeserializeError> {
27 let len = raw.array()?;
28 let ret = Self::deserialize_as_embedded_group(raw, len)?;
29 check_len_indefinite(raw, len)?;
30 Ok(ret)
31 })()
32 .map_err(|e| e.annotate("VotingProposal"))
33 }
34}
35
36impl DeserializeEmbeddedGroup for GovernanceAction {
37 fn deserialize_as_embedded_group<R: BufRead + Seek>(
38 raw: &mut Deserializer<R>,
39 len: cbor_event::Len,
40 ) -> Result<Self, DeserializeError> {
41 let cert_index = get_proposal_index(raw)?;
42 let index_enum =
43 VotingProposalIndexNames::from_u64(cert_index).ok_or(DeserializeError::new(
44 "VotingProposal",
45 DeserializeFailure::UnknownKey(Key::Uint(cert_index)),
46 ))?;
47
48 let proposal_enum = match index_enum {
49 VotingProposalIndexNames::ParameterChangeAction => {
50 Ok::<GovernanceActionEnum, DeserializeError>(
51 GovernanceActionEnum::ParameterChangeAction(
52 ParameterChangeAction::deserialize_as_embedded_group(raw, len)?,
53 ),
54 )
55 }
56 VotingProposalIndexNames::HardForkInitiationAction => {
57 Ok(GovernanceActionEnum::HardForkInitiationAction(
58 HardForkInitiationAction::deserialize_as_embedded_group(raw, len)?,
59 ))
60 }
61 VotingProposalIndexNames::TreasuryWithdrawalsAction => {
62 Ok(GovernanceActionEnum::TreasuryWithdrawalsAction(
63 TreasuryWithdrawalsAction::deserialize_as_embedded_group(raw, len)?,
64 ))
65 }
66 VotingProposalIndexNames::NoConfidenceAction => {
67 Ok(GovernanceActionEnum::NoConfidenceAction(
68 NoConfidenceAction::deserialize_as_embedded_group(raw, len)?,
69 ))
70 }
71 VotingProposalIndexNames::UpdateCommitteeAction => {
72 Ok(GovernanceActionEnum::UpdateCommitteeAction(
73 UpdateCommitteeAction::deserialize_as_embedded_group(raw, len)?,
74 ))
75 }
76 VotingProposalIndexNames::NewConstitutionAction => {
77 Ok(GovernanceActionEnum::NewConstitutionAction(
78 NewConstitutionAction::deserialize_as_embedded_group(raw, len)?,
79 ))
80 }
81 VotingProposalIndexNames::InfoAction => Ok(GovernanceActionEnum::InfoAction(
82 InfoAction::deserialize_as_embedded_group(raw, len)?,
83 )),
84 }?;
85
86 Ok(Self(proposal_enum))
87 }
88}
89
90fn get_proposal_index<R: BufRead + Seek>(
91 raw: &mut Deserializer<R>,
92) -> Result<u64, DeserializeError> {
93 let initial_position = raw
94 .as_mut_ref()
95 .seek(SeekFrom::Current(0))
96 .map_err(|err| DeserializeFailure::IoError(err.to_string()))?;
97 let index = raw.unsigned_integer()?;
98 raw.as_mut_ref()
99 .seek(SeekFrom::Start(initial_position))
100 .map_err(|err| DeserializeFailure::IoError(err.to_string()))?;
101 Ok(index)
102}