cardano_serialization_lib/serialization/governance/proposals/
governance_action.rs

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