spherenet_program_whitelist_interface/state/
mod.rs1pub mod account;
2pub mod whitelist_entry;
3
4use {bytemuck::Pod, core::mem, pinocchio::program_error::ProgramError, shank::ShankType};
5
6pub trait SizeOf {
8 const SIZE_OF: usize;
10}
11
12impl<T: Pod> SizeOf for T {
14 const SIZE_OF: usize = mem::size_of::<T>();
15}
16
17pub trait Initializable {
19 fn is_initialized(&self) -> bool;
22}
23
24#[repr(u8)]
27#[derive(Clone, Copy, Debug, PartialEq, ShankType)]
28pub enum AccountState {
29 Uninitialized,
31 Initialized,
33}
34
35#[repr(u8)]
38#[derive(Clone, Copy, Debug, PartialEq, ShankType)]
39pub enum EntryState {
40 Uninitialized,
42 Pending,
44 Approved,
46}
47
48#[inline(always)]
50pub fn load<T: Pod + Initializable>(input: &[u8]) -> Result<&T, ProgramError> {
51 if input.len() != T::SIZE_OF {
52 return Err(ProgramError::InvalidAccountData);
53 }
54
55 let account = bytemuck::from_bytes::<T>(input);
56
57 if !account.is_initialized() {
58 return Err(ProgramError::UninitializedAccount);
59 }
60
61 Ok(account)
62}
63
64#[inline(always)]
66pub fn load_mut<T: Pod + Initializable>(
67 input: &mut [u8],
68) -> Result<&mut T, ProgramError> {
69 if input.len() != T::SIZE_OF {
70 return Err(ProgramError::InvalidAccountData);
71 }
72
73 let account = bytemuck::from_bytes_mut::<T>(input);
74
75 if !account.is_initialized() {
76 return Err(ProgramError::UninitializedAccount);
77 }
78
79 Ok(account)
80}
81
82#[inline(always)]
84pub fn load_unchecked<T: Pod>(input: &[u8]) -> Result<&T, ProgramError> {
85 if input.len() != T::SIZE_OF {
86 return Err(ProgramError::InvalidAccountData);
87 }
88
89 Ok(bytemuck::from_bytes::<T>(input))
90}
91
92#[inline(always)]
94pub fn load_mut_unchecked<T: Pod>(
95 input: &mut [u8],
96) -> Result<&mut T, ProgramError> {
97 if input.len() != T::SIZE_OF {
98 return Err(ProgramError::InvalidAccountData);
99 }
100
101 Ok(bytemuck::from_bytes_mut::<T>(input))
102}