penumbra_sdk_shielded_pool/spend/
view.rs

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