light_zero_copy/
errors.rs

1use core::convert::Infallible;
2
3use thiserror::Error;
4
5#[derive(Debug, Error, PartialEq)]
6pub enum ZeroCopyError {
7    #[error("The vector is full, cannot push any new elements")]
8    Full,
9    #[error("Requested array of size {0}, but the vector has {1} elements")]
10    ArraySize(usize, usize),
11    #[error("The requested start index is out of bounds.")]
12    IterFromOutOfBounds,
13    #[error("Memory allocated {0}, Memory required {0}")]
14    InsufficientMemoryAllocated(usize, usize),
15    #[error("Unaligned pointer.")]
16    UnalignedPointer,
17    #[error("Memory not zeroed.")]
18    MemoryNotZeroed,
19    #[error("InvalidConversion.")]
20    InvalidConversion,
21    #[error("Invalid data {0}.")]
22    InvalidData(Infallible),
23    #[error("Invalid size.")]
24    Size,
25    #[error("Invalid option byte {0} must be 0 (None) or 1 (Some).")]
26    InvalidOptionByte(u8),
27    #[error("Invalid capacity. Capacity must be greater than 0.")]
28    InvalidCapacity,
29    #[error("Length is greater than capacity.")]
30    LengthGreaterThanCapacity,
31    #[error("Current index is greater than length.")]
32    CurrentIndexGreaterThanLength,
33}
34
35impl From<ZeroCopyError> for u32 {
36    fn from(e: ZeroCopyError) -> u32 {
37        match e {
38            ZeroCopyError::Full => 15001,
39            ZeroCopyError::ArraySize(_, _) => 15002,
40            ZeroCopyError::IterFromOutOfBounds => 15003,
41            ZeroCopyError::InsufficientMemoryAllocated(_, _) => 15004,
42            ZeroCopyError::UnalignedPointer => 15006,
43            ZeroCopyError::MemoryNotZeroed => 15007,
44            ZeroCopyError::InvalidConversion => 15008,
45            ZeroCopyError::InvalidData(_) => 15009,
46            ZeroCopyError::Size => 15010,
47            ZeroCopyError::InvalidOptionByte(_) => 15011,
48            ZeroCopyError::InvalidCapacity => 15012,
49            ZeroCopyError::LengthGreaterThanCapacity => 15013,
50            ZeroCopyError::CurrentIndexGreaterThanLength => 15014,
51        }
52    }
53}
54
55#[cfg(feature = "pinocchio")]
56impl From<ZeroCopyError> for pinocchio::program_error::ProgramError {
57    fn from(e: ZeroCopyError) -> Self {
58        pinocchio::program_error::ProgramError::Custom(e.into())
59    }
60}
61
62#[cfg(feature = "solana")]
63impl From<ZeroCopyError> for solana_program_error::ProgramError {
64    fn from(e: ZeroCopyError) -> Self {
65        solana_program_error::ProgramError::Custom(e.into())
66    }
67}
68
69impl<Src, Dst: ?Sized>
70    From<
71        zerocopy::ConvertError<
72            zerocopy::AlignmentError<Src, Dst>,
73            zerocopy::SizeError<Src, Dst>,
74            core::convert::Infallible,
75        >,
76    > for ZeroCopyError
77{
78    fn from(
79        err: zerocopy::ConvertError<
80            zerocopy::AlignmentError<Src, Dst>,
81            zerocopy::SizeError<Src, Dst>,
82            core::convert::Infallible,
83        >,
84    ) -> Self {
85        match err {
86            zerocopy::ConvertError::Alignment(_) => ZeroCopyError::UnalignedPointer,
87            zerocopy::ConvertError::Size(_) => ZeroCopyError::Size,
88            zerocopy::ConvertError::Validity(i) => ZeroCopyError::InvalidData(i),
89        }
90    }
91}