1#![warn(missing_docs)]
3use thiserror::Error;
4
5use crate::nvtiffStatus;
6
7pub type NvTiffResult<T> = Result<T, NvTiffError>;
9
10#[derive(Debug, Error)]
12#[non_exhaustive]
13pub enum NvTiffError {
14 #[error("Status error: {0}")]
16 StatusError(NvTiffStatusError),
17}
18
19#[derive(Debug, Eq, Error, PartialEq)]
24#[non_exhaustive]
25pub enum NvTiffStatusError {
26 #[error("The library handle was not initialized.")]
28 NotInitialized, #[error("Wrong parameter was passed.")]
32 InvalidParameter, #[error("Cannot parse the TIFF stream.")]
35 BadTiff, #[error("Attempting to decode a TIFF stream that is not supported by the nvTIFF library.")]
38 TiffNotSupported, #[error("The user-provided allocator functions returned a non-zero code.")]
42 AllocatorFailure, #[error("Error during the execution of the device tasks.")]
45 ExecutionFailed, #[error("The device capabilities are not enough for the set of input parameters provided.")]
48 ArchMismatch, #[error("Unknown error occured in the library.")]
51 InternalError, #[error("nvTiff is unable to load the nvCOMP library.")]
54 NvcompNotFound, #[error("nvTiff is unable to load the nvJPEG library.")]
57 NvjpegNotFound, #[error("nvTiff is unable to find information about the provided tag.")]
60 TagNotFound, #[error("Provided parameter is outside the range of possible values.")]
63 ParameterOutOfBounds, #[error("nvTiff is unable to load the nvJPEG2000 library.")]
66 Nvjpeg2kNotFound, #[error(
72 "Requested regions cannot execute as one compatible batch under the current batching rules."
73 )]
74 BatchIncompatible,
75
76 #[error("Unknown nvTiff error with status code {0}")]
79 Other(u32),
80}
81
82pub trait NvTiffResultCheck {
84 fn result(self) -> NvTiffResult<()>;
89}
90
91impl NvTiffResultCheck for nvtiffStatus::Type {
92 fn result(self) -> NvTiffResult<()> {
99 match self {
100 nvtiffStatus::NVTIFF_STATUS_SUCCESS => Ok(()),
101 nvtiffStatus::NVTIFF_STATUS_NOT_INITIALIZED => {
102 Err(NvTiffError::StatusError(NvTiffStatusError::NotInitialized))
103 }
104 nvtiffStatus::NVTIFF_STATUS_INVALID_PARAMETER => Err(NvTiffError::StatusError(
105 NvTiffStatusError::InvalidParameter,
106 )),
107 nvtiffStatus::NVTIFF_STATUS_BAD_TIFF => {
108 Err(NvTiffError::StatusError(NvTiffStatusError::BadTiff))
109 }
110 nvtiffStatus::NVTIFF_STATUS_TIFF_NOT_SUPPORTED => Err(NvTiffError::StatusError(
111 NvTiffStatusError::TiffNotSupported,
112 )),
113 nvtiffStatus::NVTIFF_STATUS_ALLOCATOR_FAILURE => Err(NvTiffError::StatusError(
114 NvTiffStatusError::AllocatorFailure,
115 )),
116 nvtiffStatus::NVTIFF_STATUS_EXECUTION_FAILED => {
117 Err(NvTiffError::StatusError(NvTiffStatusError::ExecutionFailed))
118 }
119 nvtiffStatus::NVTIFF_STATUS_ARCH_MISMATCH => {
120 Err(NvTiffError::StatusError(NvTiffStatusError::ArchMismatch))
121 }
122 nvtiffStatus::NVTIFF_STATUS_INTERNAL_ERROR => {
123 Err(NvTiffError::StatusError(NvTiffStatusError::InternalError))
124 }
125 nvtiffStatus::NVTIFF_STATUS_NVCOMP_NOT_FOUND => {
126 Err(NvTiffError::StatusError(NvTiffStatusError::NvcompNotFound))
127 }
128 nvtiffStatus::NVTIFF_STATUS_NVJPEG_NOT_FOUND => {
129 Err(NvTiffError::StatusError(NvTiffStatusError::NvjpegNotFound))
130 }
131 nvtiffStatus::NVTIFF_STATUS_TAG_NOT_FOUND => {
132 Err(NvTiffError::StatusError(NvTiffStatusError::TagNotFound))
133 }
134 nvtiffStatus::NVTIFF_STATUS_PARAMETER_OUT_OF_BOUNDS => Err(NvTiffError::StatusError(
135 NvTiffStatusError::ParameterOutOfBounds,
136 )),
137 nvtiffStatus::NVTIFF_STATUS_NVJPEG2K_NOT_FOUND => Err(NvTiffError::StatusError(
138 NvTiffStatusError::Nvjpeg2kNotFound,
139 )),
140 nvtiffStatus::NVTIFF_STATUS_BATCH_INCOMPATIBLE => Err(NvTiffError::StatusError(
141 NvTiffStatusError::BatchIncompatible,
142 )),
143 status_code => Err(NvTiffError::StatusError(NvTiffStatusError::Other(
145 status_code,
146 ))),
147 }
148 }
149}
150
151#[cfg(test)]
152mod tests {
153 use std::ffi::CString;
154
155 use crate::{
156 NvTiffResultCheck, nvtiffStatus, nvtiffStream, nvtiffStreamGetNextIFDOffset,
157 nvtiffStreamOpenFromFile,
158 };
159
160 #[test]
161 fn nvtiff_status_result() {
162 let mut stream = std::mem::MaybeUninit::uninit();
163 let mut tiff_stream: *mut nvtiffStream = stream.as_mut_ptr();
164
165 let tiff_cstr = CString::new("images/float32.tif").unwrap();
166 let tiff_path: *const std::os::raw::c_char = tiff_cstr.as_ptr();
167
168 let status_create: nvtiffStatus::Type =
170 unsafe { nvtiffStreamOpenFromFile(tiff_path, &raw mut tiff_stream) };
171 dbg!(status_create); assert!(status_create.result().is_ok());
173
174 let tiff_cstr = CString::new("images/invalid.tif").unwrap();
175 let tiff_path: *const std::os::raw::c_char = tiff_cstr.as_ptr();
176
177 let status_parse: nvtiffStatus::Type =
179 unsafe { nvtiffStreamOpenFromFile(tiff_path, &raw mut tiff_stream) };
180 dbg!(status_parse); assert!(status_parse.result().is_err());
182 }
183
184 #[test]
185 fn nvtiff_other_error() {
186 let status_unknown: nvtiffStatus::Type = 42; dbg!(status_unknown); assert!(status_unknown.result().is_err());
189 }
190
191 #[test]
192 fn status_to_string() {
193 let mut host_stream = std::mem::MaybeUninit::uninit();
194 let tiff_stream: *mut nvtiffStream = host_stream.as_mut_ptr();
195
196 let mut ifd_offset: usize = 0;
198 let status_nextifdoffset: u32 =
199 unsafe { nvtiffStreamGetNextIFDOffset(tiff_stream, ifd_offset, &raw mut ifd_offset) };
200 dbg!(status_nextifdoffset);
201
202 assert_eq!(
204 status_nextifdoffset.result().unwrap_err().to_string(),
205 "Status error: Wrong parameter was passed.".to_string()
206 );
207 }
208}