dpp/voting/votes/
mod.rs

1pub mod resource_vote;
2
3#[cfg(feature = "json-conversion")]
4use crate::serialization::JsonConvertible;
5#[cfg(feature = "value-conversion")]
6use crate::serialization::ValueConvertible;
7use crate::voting::votes::resource_vote::accessors::v0::ResourceVoteGettersV0;
8use crate::voting::votes::resource_vote::ResourceVote;
9use crate::ProtocolError;
10use bincode::{Decode, Encode};
11use derive_more::From;
12use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize};
13use platform_value::Identifier;
14#[cfg(feature = "serde-conversion")]
15use serde::{Deserialize, Serialize};
16
17#[derive(Debug, Clone, Encode, Decode, PlatformSerialize, PlatformDeserialize, PartialEq, From)]
18#[cfg_attr(
19    feature = "serde-conversion",
20    derive(Serialize, Deserialize),
21    serde(tag = "type", content = "data", rename_all = "camelCase")
22)]
23#[cfg_attr(feature = "value-conversion", derive(ValueConvertible))]
24#[platform_serialize(limit = 15000, unversioned)]
25pub enum Vote {
26    ResourceVote(ResourceVote),
27}
28
29// Manual impl because Vote is a flat enum (not versioned V0/V1).
30#[cfg(feature = "json-conversion")]
31impl JsonConvertible for Vote {}
32
33impl Default for Vote {
34    fn default() -> Self {
35        Vote::ResourceVote(ResourceVote::default())
36    }
37}
38
39impl Vote {
40    pub fn specialized_balance_id(&self) -> Result<Option<Identifier>, ProtocolError> {
41        match self {
42            Vote::ResourceVote(resource_vote) => resource_vote.vote_poll().specialized_balance_id(),
43        }
44    }
45    pub fn vote_poll_unique_id(&self) -> Result<Identifier, ProtocolError> {
46        match self {
47            Vote::ResourceVote(resource_vote) => resource_vote.vote_poll().unique_id(),
48        }
49    }
50}
51
52#[cfg(all(test, feature = "json-conversion"))]
53mod tests {
54    use super::*;
55    use crate::serialization::JsonConvertible;
56    use crate::voting::vote_choices::resource_vote_choice::ResourceVoteChoice;
57    use crate::voting::vote_polls::contested_document_resource_vote_poll::ContestedDocumentResourceVotePoll;
58    use crate::voting::vote_polls::VotePoll;
59    use crate::voting::votes::resource_vote::v0::ResourceVoteV0;
60    use crate::voting::votes::resource_vote::ResourceVote;
61
62    #[test]
63    fn vote_json_round_trip() {
64        let contract_id = Identifier::from([0x11u8; 32]);
65        let towards_id = Identifier::from([0x22u8; 32]);
66
67        let vote = Vote::ResourceVote(ResourceVote::V0(ResourceVoteV0 {
68            vote_poll: VotePoll::ContestedDocumentResourceVotePoll(
69                ContestedDocumentResourceVotePoll {
70                    contract_id,
71                    document_type_name: "domain".to_string(),
72                    index_name: "parentNameAndLabel".to_string(),
73                    index_values: vec![platform_value::Value::Text("dash".to_string())],
74                },
75            ),
76            resource_vote_choice: ResourceVoteChoice::TowardsIdentity(towards_id),
77        }));
78
79        let json = vote.to_json().expect("to_json should succeed");
80
81        // Verify it's a valid JSON object
82        assert!(json.is_object(), "Vote JSON should be an object");
83
84        // round-trip
85        let restored = Vote::from_json(json).expect("from_json should succeed");
86        assert_eq!(vote, restored);
87    }
88}