light_zero_copy/
errors.rs1use 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}