penumbra_sdk_shielded_pool/output/
view.rs1use 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}