solana_zk_sdk/zk_elgamal_proof_program/proof_data/
pod.rs

1use {
2    crate::zk_elgamal_proof_program::proof_data::{errors::ProofDataError, ProofType},
3    bytemuck_derive::{Pod, Zeroable},
4    num_traits::{FromPrimitive, ToPrimitive},
5};
6
7#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Pod, Zeroable)]
8#[repr(transparent)]
9pub struct PodProofType(u8);
10impl From<ProofType> for PodProofType {
11    fn from(proof_type: ProofType) -> Self {
12        Self(ToPrimitive::to_u8(&proof_type).unwrap())
13    }
14}
15impl TryFrom<PodProofType> for ProofType {
16    type Error = ProofDataError;
17
18    fn try_from(pod: PodProofType) -> Result<Self, Self::Error> {
19        FromPrimitive::from_u8(pod.0).ok_or(Self::Error::InvalidProofType)
20    }
21}
22
23macro_rules! impl_wasm_to_bytes {
24    (TYPE = $type:ident) => {
25        #[cfg(not(target_os = "solana"))]
26        #[cfg_attr(target_arch = "wasm32", wasm_bindgen)]
27        impl $type {
28            #[cfg_attr(target_arch = "wasm32", wasm_bindgen(js_name = toBytes))]
29            pub fn to_bytes(&self) -> Box<[u8]> {
30                bytes_of(self).into()
31            }
32
33            #[cfg_attr(target_arch = "wasm32", wasm_bindgen(js_name = fromBytes))]
34            pub fn from_bytes(bytes: &[u8]) -> Result<Self, ProofDataError> {
35                bytemuck::try_from_bytes(bytes)
36                    .copied()
37                    .map_err(|_| ProofDataError::Deserialization)
38            }
39        }
40    };
41}
42pub(crate) use impl_wasm_to_bytes;