Skip to main content

dlp_api/state/utils/
try_from_bytes.rs

1#[macro_export]
2macro_rules! impl_try_from_bytes_with_discriminator_zero_copy {
3    ($struct_name:ident) => {
4        impl $struct_name {
5            pub fn try_from_bytes_with_discriminator(
6                data: &[u8],
7            ) -> Result<&Self, ::solana_program::program_error::ProgramError> {
8                let expected_len = 8 + ::std::mem::size_of::<Self>();
9                if data.len() < expected_len {
10                    return Err($crate::error::DlpError::InvalidDataLength.into());
11                }
12                if Self::discriminator().to_bytes().ne(&data[..8]) {
13                    return Err($crate::error::DlpError::InvalidDiscriminator.into());
14                }
15                bytemuck::try_from_bytes::<Self>(&data[8..expected_len]).or(Err(
16                    $crate::error::DlpError::InvalidDelegationRecordData.into(),
17                ))
18            }
19            pub fn try_from_bytes_with_discriminator_mut(
20                data: &mut [u8],
21            ) -> Result<&mut Self, ::solana_program::program_error::ProgramError> {
22                let expected_len = 8 + ::std::mem::size_of::<Self>();
23                if data.len() < expected_len {
24                    return Err($crate::error::DlpError::InvalidDataLength.into());
25                }
26                if Self::discriminator().to_bytes().ne(&data[..8]) {
27                    return Err($crate::error::DlpError::InvalidDiscriminator.into());
28                }
29                bytemuck::try_from_bytes_mut::<Self>(&mut data[8..expected_len]).or(Err(
30                    $crate::error::DlpError::InvalidDelegationRecordData.into(),
31                ))
32            }
33        }
34    };
35}
36
37#[macro_export]
38macro_rules! impl_try_from_bytes_with_discriminator_borsh {
39    ($struct_name:ident) => {
40        impl $struct_name {
41            pub fn try_from_bytes_with_discriminator(
42                data: &[u8],
43            ) -> Result<Self, ::solana_program::program_error::ProgramError>
44            {
45                if data.len() < 8 {
46                    return Err(
47                        $crate::error::DlpError::InvalidDataLength.into()
48                    );
49                }
50                if Self::discriminator().to_bytes().ne(&data[..8]) {
51                    return Err(
52                        $crate::error::DlpError::InvalidDiscriminator.into()
53                    );
54                }
55                Self::try_from_slice(&data[8..]).or(Err(
56                    $crate::error::DlpError::InvalidDelegationRecordData.into(),
57                ))
58            }
59        }
60    };
61}