1use {
3 bytemuck::{Pod, Zeroable},
4 solana_program_pack::IsInitialized,
5 solana_pubkey::Pubkey,
6};
7
8#[repr(C)]
10#[derive(Clone, Copy, Debug, PartialEq, Pod, Zeroable)]
11pub struct RecordData {
12 pub version: u8,
14
15 pub authority: Pubkey,
17}
18
19impl RecordData {
20 pub const CURRENT_VERSION: u8 = 1;
22
23 pub const WRITABLE_START_INDEX: usize = 33;
25}
26
27impl IsInitialized for RecordData {
28 fn is_initialized(&self) -> bool {
30 self.version == Self::CURRENT_VERSION
31 }
32}
33
34#[cfg(test)]
35pub mod tests {
36 use {super::*, solana_program_error::ProgramError};
37
38 pub const TEST_VERSION: u8 = 1;
40 pub const TEST_PUBKEY: Pubkey = Pubkey::new_from_array([100; 32]);
42 pub const TEST_BYTES: [u8; 8] = [42; 8];
44 pub const TEST_RECORD_DATA: RecordData = RecordData {
46 version: TEST_VERSION,
47 authority: TEST_PUBKEY,
48 };
49
50 #[test]
51 fn serialize_data() {
52 let mut expected = vec![TEST_VERSION];
53 expected.extend_from_slice(&TEST_PUBKEY.to_bytes());
54 assert_eq!(bytemuck::bytes_of(&TEST_RECORD_DATA), expected);
55 assert_eq!(
56 *bytemuck::try_from_bytes::<RecordData>(&expected).unwrap(),
57 TEST_RECORD_DATA,
58 );
59 }
60
61 #[test]
62 fn deserialize_invalid_slice() {
63 let mut expected = vec![TEST_VERSION];
64 expected.extend_from_slice(&TEST_PUBKEY.to_bytes());
65 expected.extend_from_slice(&TEST_BYTES);
66 let err = bytemuck::try_from_bytes::<RecordData>(&expected)
67 .map_err(|_| ProgramError::InvalidArgument)
68 .unwrap_err();
69 assert_eq!(err, ProgramError::InvalidArgument);
70 }
71}