light_zero_copy/
errors.rs

1use core::{convert::Infallible, fmt};
2#[cfg(feature = "std")]
3use std::error::Error;
4
5#[derive(Debug, PartialEq)]
6pub enum ZeroCopyError {
7    Full,
8    ArraySize(usize, usize),
9    IterFromOutOfBounds,
10    InsufficientMemoryAllocated(usize, usize),
11    UnalignedPointer,
12    MemoryNotZeroed,
13    InvalidConversion,
14    InvalidData(Infallible),
15    Size,
16    InvalidOptionByte(u8),
17    InvalidCapacity,
18    LengthGreaterThanCapacity,
19    CurrentIndexGreaterThanLength,
20    InvalidEnumValue,
21    InsufficientCapacity,
22    PlatformSizeOverflow,
23}
24
25impl fmt::Display for ZeroCopyError {
26    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
27        match self {
28            ZeroCopyError::Full => write!(f, "The vector is full, cannot push any new elements"),
29            ZeroCopyError::ArraySize(expected, actual) => write!(
30                f,
31                "Requested array of size {}, but the vector has {} elements",
32                expected, actual
33            ),
34            ZeroCopyError::IterFromOutOfBounds => {
35                write!(f, "The requested start index is out of bounds")
36            }
37            ZeroCopyError::InsufficientMemoryAllocated(allocated, required) => write!(
38                f,
39                "Memory allocated {}, Memory required {}",
40                allocated, required
41            ),
42            ZeroCopyError::UnalignedPointer => write!(f, "Unaligned pointer"),
43            ZeroCopyError::MemoryNotZeroed => write!(f, "Memory not zeroed"),
44            ZeroCopyError::InvalidConversion => write!(f, "Invalid conversion"),
45            ZeroCopyError::InvalidData(_) => write!(f, "Invalid data"),
46            ZeroCopyError::Size => write!(f, "Invalid size"),
47            ZeroCopyError::InvalidOptionByte(byte) => write!(
48                f,
49                "Invalid option byte {} must be 0 (None) or 1 (Some)",
50                byte
51            ),
52            ZeroCopyError::InvalidCapacity => {
53                write!(f, "Invalid capacity. Capacity must be greater than 0")
54            }
55            ZeroCopyError::LengthGreaterThanCapacity => {
56                write!(f, "Length is greater than capacity")
57            }
58            ZeroCopyError::CurrentIndexGreaterThanLength => {
59                write!(f, "Current index is greater than length")
60            }
61            ZeroCopyError::InvalidEnumValue => write!(f, "Invalid enum value"),
62            ZeroCopyError::InsufficientCapacity => write!(f, "Insufficient capacity for operation"),
63            ZeroCopyError::PlatformSizeOverflow => write!(f, "Value too large for platform usize"),
64        }
65    }
66}
67
68#[cfg(feature = "std")]
69impl Error for ZeroCopyError {}
70
71impl From<ZeroCopyError> for u32 {
72    fn from(e: ZeroCopyError) -> u32 {
73        match e {
74            ZeroCopyError::Full => 15001,
75            ZeroCopyError::ArraySize(_, _) => 15002,
76            ZeroCopyError::IterFromOutOfBounds => 15003,
77            ZeroCopyError::InsufficientMemoryAllocated(_, _) => 15004,
78            ZeroCopyError::UnalignedPointer => 15006,
79            ZeroCopyError::MemoryNotZeroed => 15007,
80            ZeroCopyError::InvalidConversion => 15008,
81            ZeroCopyError::InvalidData(_) => 15009,
82            ZeroCopyError::Size => 15010,
83            ZeroCopyError::InvalidOptionByte(_) => 15011,
84            ZeroCopyError::InvalidCapacity => 15012,
85            ZeroCopyError::LengthGreaterThanCapacity => 15013,
86            ZeroCopyError::CurrentIndexGreaterThanLength => 15014,
87            ZeroCopyError::InvalidEnumValue => 15015,
88            ZeroCopyError::InsufficientCapacity => 15016,
89            ZeroCopyError::PlatformSizeOverflow => 15017,
90        }
91    }
92}
93
94#[cfg(feature = "pinocchio")]
95impl From<ZeroCopyError> for pinocchio::program_error::ProgramError {
96    fn from(e: ZeroCopyError) -> Self {
97        pinocchio::program_error::ProgramError::Custom(e.into())
98    }
99}
100
101#[cfg(feature = "solana")]
102impl From<ZeroCopyError> for solana_program_error::ProgramError {
103    fn from(e: ZeroCopyError) -> Self {
104        solana_program_error::ProgramError::Custom(e.into())
105    }
106}
107
108impl<Src, Dst: ?Sized>
109    From<
110        zerocopy::ConvertError<
111            zerocopy::AlignmentError<Src, Dst>,
112            zerocopy::SizeError<Src, Dst>,
113            core::convert::Infallible,
114        >,
115    > for ZeroCopyError
116{
117    fn from(
118        err: zerocopy::ConvertError<
119            zerocopy::AlignmentError<Src, Dst>,
120            zerocopy::SizeError<Src, Dst>,
121            core::convert::Infallible,
122        >,
123    ) -> Self {
124        match err {
125            zerocopy::ConvertError::Alignment(_) => ZeroCopyError::UnalignedPointer,
126            zerocopy::ConvertError::Size(_) => ZeroCopyError::Size,
127            zerocopy::ConvertError::Validity(i) => ZeroCopyError::InvalidData(i),
128        }
129    }
130}