dlp_api/state/utils/
try_from_bytes.rs1#[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}