penumbra_sdk_shielded_pool/output/
view.rs

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