penumbra_sdk_governance/delegator_vote/
view.rs1use 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}