1use std::char::TryFromCharError;
2use std::ffi::NulError;
3use std::fmt;
4use std::num::TryFromIntError;
5
6use crate::core;
7
8pub struct Error {
9 pub code: i32,
10 pub message: String,
11}
12
13impl Error {
14 #[inline]
15 pub fn new(code: i32, message: impl Into<String>) -> Self {
16 Self {
17 code,
18 message: message.into(),
19 }
20 }
21
22 #[inline]
23 pub fn code_as_enum(&self) -> Option<core::Code> {
24 error_code_as_enum(self.code)
25 }
26
27 fn format_code(&self) -> String {
28 if let Some(code) = self.code_as_enum() {
29 format!("{code:?}, {}", self.code)
30 } else {
31 format!("{}", self.code)
32 }
33 }
34}
35
36impl fmt::Display for Error {
37 #[inline]
38 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
39 write!(f, "{} (code: {})", self.message, self.format_code())
40 }
41}
42
43impl fmt::Debug for Error {
44 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
45 f.debug_struct("Error")
46 .field("code", &self.format_code())
47 .field("message", &self.message)
48 .finish()
49 }
50}
51
52impl From<NulError> for Error {
53 #[inline]
54 fn from(_: NulError) -> Self {
55 Self::new(core::StsBadArg, "Passed Rust string contains nul byte")
56 }
57}
58
59impl From<TryFromCharError> for Error {
60 #[inline]
61 fn from(_: TryFromCharError) -> Self {
62 Self::new(core::StsBadArg, "Passed Rust char can't be converted to C++ char")
63 }
64}
65
66impl From<TryFromIntError> for Error {
67 fn from(_: TryFromIntError) -> Self {
68 Self::new(
69 core::StsBadArg,
70 "Passed slice argument is too long, likely length doesn't fit i32",
71 )
72 }
73}
74
75impl std::error::Error for Error {}
76
77pub type Result<T, E = Error> = std::result::Result<T, E>;
78
79pub fn error_code_as_enum(code: i32) -> Option<core::Code> {
80 match code {
81 core::StsOk => Some(core::Code::StsOk),
82 core::StsBackTrace => Some(core::Code::StsBackTrace),
83 core::StsError => Some(core::Code::StsError),
84 core::StsInternal => Some(core::Code::StsInternal),
85 core::StsNoMem => Some(core::Code::StsNoMem),
86 core::StsBadArg => Some(core::Code::StsBadArg),
87 core::StsBadFunc => Some(core::Code::StsBadFunc),
88 core::StsNoConv => Some(core::Code::StsNoConv),
89 core::StsAutoTrace => Some(core::Code::StsAutoTrace),
90 core::HeaderIsNull => Some(core::Code::HeaderIsNull),
91 core::BadImageSize => Some(core::Code::BadImageSize),
92 core::BadOffset => Some(core::Code::BadOffset),
93 core::BadDataPtr => Some(core::Code::BadDataPtr),
94 core::BadStep => Some(core::Code::BadStep),
95 core::BadModelOrChSeq => Some(core::Code::BadModelOrChSeq),
96 core::BadNumChannels => Some(core::Code::BadNumChannels),
97 core::BadNumChannel1U => Some(core::Code::BadNumChannel1U),
98 core::BadDepth => Some(core::Code::BadDepth),
99 core::BadAlphaChannel => Some(core::Code::BadAlphaChannel),
100 core::BadOrder => Some(core::Code::BadOrder),
101 core::BadOrigin => Some(core::Code::BadOrigin),
102 core::BadAlign => Some(core::Code::BadAlign),
103 core::BadCallBack => Some(core::Code::BadCallBack),
104 core::BadTileSize => Some(core::Code::BadTileSize),
105 core::BadCOI => Some(core::Code::BadCOI),
106 core::BadROISize => Some(core::Code::BadROISize),
107 core::MaskIsTiled => Some(core::Code::MaskIsTiled),
108 core::StsNullPtr => Some(core::Code::StsNullPtr),
109 core::StsVecLengthErr => Some(core::Code::StsVecLengthErr),
110 core::StsFilterStructContentErr => Some(core::Code::StsFilterStructContentErr),
111 core::StsKernelStructContentErr => Some(core::Code::StsKernelStructContentErr),
112 core::StsFilterOffsetErr => Some(core::Code::StsFilterOffsetErr),
113 core::StsBadSize => Some(core::Code::StsBadSize),
114 core::StsDivByZero => Some(core::Code::StsDivByZero),
115 core::StsInplaceNotSupported => Some(core::Code::StsInplaceNotSupported),
116 core::StsObjectNotFound => Some(core::Code::StsObjectNotFound),
117 core::StsUnmatchedFormats => Some(core::Code::StsUnmatchedFormats),
118 core::StsBadFlag => Some(core::Code::StsBadFlag),
119 core::StsBadPoint => Some(core::Code::StsBadPoint),
120 core::StsBadMask => Some(core::Code::StsBadMask),
121 core::StsUnmatchedSizes => Some(core::Code::StsUnmatchedSizes),
122 core::StsUnsupportedFormat => Some(core::Code::StsUnsupportedFormat),
123 core::StsOutOfRange => Some(core::Code::StsOutOfRange),
124 core::StsParseError => Some(core::Code::StsParseError),
125 core::StsNotImplemented => Some(core::Code::StsNotImplemented),
126 core::StsBadMemBlock => Some(core::Code::StsBadMemBlock),
127 core::StsAssert => Some(core::Code::StsAssert),
128 core::GpuNotSupported => Some(core::Code::GpuNotSupported),
129 core::GpuApiCallError => Some(core::Code::GpuApiCallError),
130 core::OpenGlNotSupported => Some(core::Code::OpenGlNotSupported),
131 core::OpenGlApiCallError => Some(core::Code::OpenGlApiCallError),
132 core::OpenCLApiCallError => Some(core::Code::OpenCLApiCallError),
133 core::OpenCLDoubleNotSupported => Some(core::Code::OpenCLDoubleNotSupported),
134 core::OpenCLInitError => Some(core::Code::OpenCLInitError),
135 core::OpenCLNoAMDBlasFft => Some(core::Code::OpenCLNoAMDBlasFft),
136 _ => None,
137 }
138}