11//! Error types
2+ use pinocchio:: program_error:: ProgramError as PinocchioProgramError ;
23use {
4+ bytemuck:: PodCastError ,
35 solana_program_error:: { ProgramError , ToStr } ,
46 std:: num:: TryFromIntError ,
57} ;
1517 num_enum:: TryFromPrimitive ,
1618 num_derive:: FromPrimitive ,
1719) ]
18- pub enum PodSliceError {
20+ pub enum SplPodError {
1921 /// Error in checked math operation
2022 #[ error( "Error in checked math operation" ) ]
2123 CalculationFailure ,
@@ -25,30 +27,90 @@ pub enum PodSliceError {
2527 /// Provided byte buffer too large for expected type
2628 #[ error( "Provided byte buffer too large for expected type" ) ]
2729 BufferTooLarge ,
30+ /// Index out of range for list operation
31+ #[ error( "Index out of range for list operation" ) ]
32+ IndexOutOfRange ,
33+ /// Type used as a length prefix has invalid alignment
34+ #[ error( "Type used as a length prefix has invalid alignment" ) ]
35+ InvalidLengthTypeAlignment ,
36+ /// A `PodCast` operation from `bytemuck` failed
37+ #[ error( "A `PodCast` operation from `bytemuck` failed" ) ]
38+ PodCast ,
2839 /// An integer conversion failed because the value was out of range for the target type
2940 #[ error( "An integer conversion failed because the value was out of range for the target type" ) ]
3041 ValueOutOfRange ,
3142}
3243
33- impl From < PodSliceError > for ProgramError {
34- fn from ( e : PodSliceError ) -> Self {
44+ impl From < SplPodError > for ProgramError {
45+ fn from ( e : SplPodError ) -> Self {
3546 ProgramError :: Custom ( e as u32 )
3647 }
3748}
3849
39- impl ToStr for PodSliceError {
50+ impl ToStr for SplPodError {
4051 fn to_str ( & self ) -> & ' static str {
4152 match self {
42- PodSliceError :: CalculationFailure => "Error in checked math operation" ,
43- PodSliceError :: BufferTooSmall => "Provided byte buffer too small for expected type" ,
44- PodSliceError :: BufferTooLarge => "Provided byte buffer too large for expected type" ,
45- PodSliceError :: ValueOutOfRange => "An integer conversion failed because the value was out of range for the target type"
53+ SplPodError :: CalculationFailure => "Error in checked math operation" ,
54+ SplPodError :: BufferTooSmall => "Provided byte buffer too small for expected type" ,
55+ SplPodError :: BufferTooLarge => "Provided byte buffer too large for expected type" ,
56+ SplPodError :: IndexOutOfRange => "Index out of range for list operation" ,
57+ SplPodError :: InvalidLengthTypeAlignment => "Type used as a length prefix has invalid alignment" ,
58+ SplPodError :: PodCast => "A `PodCast` operation from `bytemuck` failed" ,
59+ SplPodError :: ValueOutOfRange => "An integer conversion failed because the value was out of range for the target type" ,
4660 }
4761 }
4862}
4963
50- impl From < TryFromIntError > for PodSliceError {
64+ impl From < PodCastError > for SplPodError {
65+ fn from ( _: PodCastError ) -> Self {
66+ SplPodError :: PodCast
67+ }
68+ }
69+
70+ impl From < TryFromIntError > for SplPodError {
5171 fn from ( _: TryFromIntError ) -> Self {
52- PodSliceError :: ValueOutOfRange
72+ SplPodError :: ValueOutOfRange
73+ }
74+ }
75+
76+ impl From < SplPodError > for PinocchioProgramError {
77+ fn from ( e : SplPodError ) -> Self {
78+ PinocchioProgramError :: Custom ( e as u32 )
79+ }
80+ }
81+
82+ #[ cfg( test) ]
83+ mod test {
84+ use super :: * ;
85+ use crate :: list:: ListView ;
86+ use pinocchio:: program_error:: ProgramError as PinocchioProgramError ;
87+
88+ fn raises_solana_err ( ) -> Result < ( ) , ProgramError > {
89+ ListView :: < u8 > :: size_of ( usize:: MAX ) ?; // raises err
90+ Ok ( ( ) )
91+ }
92+
93+ fn raises_pino_err ( ) -> Result < ( ) , PinocchioProgramError > {
94+ ListView :: < u8 > :: size_of ( usize:: MAX ) ?; // raises err
95+ Ok ( ( ) )
96+ }
97+
98+ #[ test]
99+ fn test_from_pod_slice_error_for_solana_program_error ( ) {
100+ let result = raises_solana_err ( ) ;
101+ assert ! ( result. is_err( ) ) ;
102+ let solana_err = result. unwrap_err ( ) ;
103+ let expected_err: ProgramError = SplPodError :: CalculationFailure . into ( ) ;
104+ assert_eq ! ( solana_err, expected_err) ;
105+ }
106+
107+ #[ test]
108+ fn test_from_pod_slice_error_for_pinocchio_program_error ( ) {
109+ let result = raises_pino_err ( ) ;
110+ assert ! ( result. is_err( ) ) ;
111+ let pinocchio_err = result. unwrap_err ( ) ;
112+ let expected_solana_err: ProgramError = SplPodError :: CalculationFailure . into ( ) ;
113+ let expected_pinocchio_err: PinocchioProgramError = u64:: from ( expected_solana_err) . into ( ) ;
114+ assert_eq ! ( pinocchio_err, expected_pinocchio_err) ;
53115 }
54116}
0 commit comments