typhoon-traits 0.3.0

Core trait definitions
Documentation
use {
    crate::{Accessor, MutAccessor},
    bytemuck::{try_from_bytes, try_from_bytes_mut, AnyBitPattern, NoUninit},
    solana_program_error::ProgramError,
};

pub struct BytemuckStrategy;

impl<'a, T> Accessor<'a, T> for BytemuckStrategy
where
    T: AnyBitPattern,
{
    type Data = &'a T;

    #[inline(always)]
    fn access(data: &'a [u8]) -> Result<Self::Data, ProgramError> {
        try_from_bytes(data).map_err(|_| ProgramError::BorshIoError)
    }

    #[inline(always)]
    fn read(data: &mut &'a [u8]) -> Result<Self::Data, ProgramError> {
        let len = core::mem::size_of::<T>();
        if data.len() < len {
            return Err(ProgramError::InvalidInstructionData);
        }

        let (to_read, rem) = unsafe { data.split_at_unchecked(len) };
        *data = rem;
        try_from_bytes(to_read).map_err(|_| ProgramError::BorshIoError)
    }
}
impl<'a, T> MutAccessor<'a, T> for BytemuckStrategy
where
    T: NoUninit + AnyBitPattern,
{
    type Data = &'a mut T;

    #[inline(always)]
    fn access_mut(data: &'a mut [u8]) -> Result<Self::Data, ProgramError> {
        try_from_bytes_mut(data).map_err(|_| ProgramError::BorshIoError)
    }
}