use {
bytemuck::{Pod, Zeroable},
solana_program_pack::IsInitialized,
solana_pubkey::Pubkey,
};
#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Pod, Zeroable)]
pub struct RecordData {
pub version: u8,
pub authority: Pubkey,
}
impl RecordData {
pub const CURRENT_VERSION: u8 = 1;
pub const WRITABLE_START_INDEX: usize = 33;
}
impl IsInitialized for RecordData {
fn is_initialized(&self) -> bool {
self.version == Self::CURRENT_VERSION
}
}
#[cfg(test)]
pub(crate) mod tests {
use {super::*, solana_program_error::ProgramError};
pub const TEST_VERSION: u8 = 1;
pub const TEST_PUBKEY: Pubkey = Pubkey::new_from_array([100; 32]);
pub const TEST_BYTES: [u8; 8] = [42; 8];
pub const TEST_RECORD_DATA: RecordData = RecordData {
version: TEST_VERSION,
authority: TEST_PUBKEY,
};
#[test]
fn serialize_data() {
let mut expected = vec![TEST_VERSION];
expected.extend_from_slice(&TEST_PUBKEY.to_bytes());
assert_eq!(bytemuck::bytes_of(&TEST_RECORD_DATA), expected);
assert_eq!(
*bytemuck::try_from_bytes::<RecordData>(&expected).unwrap(),
TEST_RECORD_DATA,
);
}
#[test]
fn deserialize_invalid_slice() {
let mut expected = vec![TEST_VERSION];
expected.extend_from_slice(&TEST_PUBKEY.to_bytes());
expected.extend_from_slice(&TEST_BYTES);
let err = bytemuck::try_from_bytes::<RecordData>(&expected)
.map_err(|_| ProgramError::InvalidArgument)
.unwrap_err();
assert_eq!(err, ProgramError::InvalidArgument);
}
}