opencv/
error.rs

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}