light-zero-copy 0.7.0

Zero copy vector and utils for Solana programs.
Documentation
use core::{convert::Infallible, fmt};
#[cfg(feature = "std")]
use std::error::Error;

#[derive(Debug, PartialEq)]
pub enum ZeroCopyError {
    Full,
    ArraySize(usize, usize),
    IterFromOutOfBounds,
    InsufficientMemoryAllocated(usize, usize),
    UnalignedPointer,
    MemoryNotZeroed,
    InvalidConversion,
    InvalidData(Infallible),
    Size,
    InvalidOptionByte(u8),
    InvalidCapacity,
    LengthGreaterThanCapacity,
    CurrentIndexGreaterThanLength,
    InvalidEnumValue,
    InsufficientCapacity,
    PlatformSizeOverflow,
}

impl fmt::Display for ZeroCopyError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            ZeroCopyError::Full => write!(f, "The vector is full, cannot push any new elements"),
            ZeroCopyError::ArraySize(expected, actual) => write!(
                f,
                "Requested array of size {}, but the vector has {} elements",
                expected, actual
            ),
            ZeroCopyError::IterFromOutOfBounds => {
                write!(f, "The requested start index is out of bounds")
            }
            ZeroCopyError::InsufficientMemoryAllocated(allocated, required) => write!(
                f,
                "Memory allocated {}, Memory required {}",
                allocated, required
            ),
            ZeroCopyError::UnalignedPointer => write!(f, "Unaligned pointer"),
            ZeroCopyError::MemoryNotZeroed => write!(f, "Memory not zeroed"),
            ZeroCopyError::InvalidConversion => write!(f, "Invalid conversion"),
            ZeroCopyError::InvalidData(_) => write!(f, "Invalid data"),
            ZeroCopyError::Size => write!(f, "Invalid size"),
            ZeroCopyError::InvalidOptionByte(byte) => write!(
                f,
                "Invalid option byte {} must be 0 (None) or 1 (Some)",
                byte
            ),
            ZeroCopyError::InvalidCapacity => {
                write!(f, "Invalid capacity. Capacity must be greater than 0")
            }
            ZeroCopyError::LengthGreaterThanCapacity => {
                write!(f, "Length is greater than capacity")
            }
            ZeroCopyError::CurrentIndexGreaterThanLength => {
                write!(f, "Current index is greater than length")
            }
            ZeroCopyError::InvalidEnumValue => write!(f, "Invalid enum value"),
            ZeroCopyError::InsufficientCapacity => write!(f, "Insufficient capacity for operation"),
            ZeroCopyError::PlatformSizeOverflow => write!(f, "Value too large for platform usize"),
        }
    }
}

#[cfg(feature = "std")]
impl Error for ZeroCopyError {}

impl From<ZeroCopyError> for u32 {
    fn from(e: ZeroCopyError) -> u32 {
        match e {
            ZeroCopyError::Full => 15001,
            ZeroCopyError::ArraySize(_, _) => 15002,
            ZeroCopyError::IterFromOutOfBounds => 15003,
            ZeroCopyError::InsufficientMemoryAllocated(_, _) => 15004,
            ZeroCopyError::UnalignedPointer => 15006,
            ZeroCopyError::MemoryNotZeroed => 15007,
            ZeroCopyError::InvalidConversion => 15008,
            ZeroCopyError::InvalidData(_) => 15009,
            ZeroCopyError::Size => 15010,
            ZeroCopyError::InvalidOptionByte(_) => 15011,
            ZeroCopyError::InvalidCapacity => 15012,
            ZeroCopyError::LengthGreaterThanCapacity => 15013,
            ZeroCopyError::CurrentIndexGreaterThanLength => 15014,
            ZeroCopyError::InvalidEnumValue => 15015,
            ZeroCopyError::InsufficientCapacity => 15016,
            ZeroCopyError::PlatformSizeOverflow => 15017,
        }
    }
}

#[cfg(feature = "pinocchio")]
impl From<ZeroCopyError> for pinocchio::program_error::ProgramError {
    fn from(e: ZeroCopyError) -> Self {
        pinocchio::program_error::ProgramError::Custom(e.into())
    }
}

#[cfg(feature = "solana")]
impl From<ZeroCopyError> for solana_program_error::ProgramError {
    fn from(e: ZeroCopyError) -> Self {
        solana_program_error::ProgramError::Custom(e.into())
    }
}

impl<Src, Dst: ?Sized>
    From<
        zerocopy::ConvertError<
            zerocopy::AlignmentError<Src, Dst>,
            zerocopy::SizeError<Src, Dst>,
            core::convert::Infallible,
        >,
    > for ZeroCopyError
{
    fn from(
        err: zerocopy::ConvertError<
            zerocopy::AlignmentError<Src, Dst>,
            zerocopy::SizeError<Src, Dst>,
            core::convert::Infallible,
        >,
    ) -> Self {
        match err {
            zerocopy::ConvertError::Alignment(_) => ZeroCopyError::UnalignedPointer,
            zerocopy::ConvertError::Size(_) => ZeroCopyError::Size,
            zerocopy::ConvertError::Validity(i) => ZeroCopyError::InvalidData(i),
        }
    }
}