penumbra_sdk_governance/delegator_vote/
view.rs

1use penumbra_sdk_proto::{core::component::governance::v1 as pbt, DomainType};
2use penumbra_sdk_shielded_pool::NoteView;
3use serde::{Deserialize, Serialize};
4
5use crate::DelegatorVote;
6
7#[derive(Clone, Debug, Serialize, Deserialize)]
8#[serde(try_from = "pbt::DelegatorVoteView", into = "pbt::DelegatorVoteView")]
9#[allow(clippy::large_enum_variant)]
10pub enum DelegatorVoteView {
11    Visible {
12        delegator_vote: DelegatorVote,
13        note: NoteView,
14    },
15    Opaque {
16        delegator_vote: DelegatorVote,
17    },
18}
19
20impl DomainType for DelegatorVoteView {
21    type Proto = pbt::DelegatorVoteView;
22}
23
24impl TryFrom<pbt::DelegatorVoteView> for DelegatorVoteView {
25    type Error = anyhow::Error;
26
27    fn try_from(v: pbt::DelegatorVoteView) -> Result<Self, Self::Error> {
28        match v
29            .delegator_vote
30            .ok_or_else(|| anyhow::anyhow!("missing delegator vote field"))?
31        {
32            pbt::delegator_vote_view::DelegatorVote::Visible(x) => Ok(DelegatorVoteView::Visible {
33                delegator_vote: x
34                    .delegator_vote
35                    .ok_or_else(|| anyhow::anyhow!("missing delegator vote field"))?
36                    .try_into()?,
37                note: x
38                    .note
39                    .ok_or_else(|| anyhow::anyhow!("missing note field"))?
40                    .try_into()?,
41            }),
42            pbt::delegator_vote_view::DelegatorVote::Opaque(x) => Ok(DelegatorVoteView::Opaque {
43                delegator_vote: x
44                    .delegator_vote
45                    .ok_or_else(|| anyhow::anyhow!("missing spend field"))?
46                    .try_into()?,
47            }),
48        }
49    }
50}
51
52impl From<DelegatorVoteView> for pbt::DelegatorVoteView {
53    fn from(v: DelegatorVoteView) -> Self {
54        use pbt::delegator_vote_view as dvv;
55        match v {
56            DelegatorVoteView::Visible {
57                delegator_vote,
58                note,
59            } => Self {
60                delegator_vote: Some(dvv::DelegatorVote::Visible(dvv::Visible {
61                    delegator_vote: Some(delegator_vote.into()),
62                    note: Some(note.into()),
63                })),
64            },
65            DelegatorVoteView::Opaque { delegator_vote } => Self {
66                delegator_vote: Some(dvv::DelegatorVote::Opaque(dvv::Opaque {
67                    delegator_vote: Some(delegator_vote.into()),
68                })),
69            },
70        }
71    }
72}
73
74impl From<DelegatorVoteView> for DelegatorVote {
75    fn from(v: DelegatorVoteView) -> Self {
76        match v {
77            DelegatorVoteView::Visible {
78                delegator_vote,
79                note: _,
80            } => delegator_vote,
81            DelegatorVoteView::Opaque { delegator_vote } => delegator_vote,
82        }
83    }
84}