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}