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