1#![warn(missing_docs)]
3use thiserror::Error;
4
5use crate::nvtiffStatus_t;
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("Unknown nvTiff error with status code {0}")]
71 Other(u32),
72}
73
74pub trait NvTiffResultCheck {
76 fn result(self) -> NvTiffResult<()>;
81}
82
83impl NvTiffResultCheck for nvtiffStatus_t::Type {
84 fn result(self) -> NvTiffResult<()> {
91 match self {
92 nvtiffStatus_t::NVTIFF_STATUS_SUCCESS => Ok(()),
93 nvtiffStatus_t::NVTIFF_STATUS_NOT_INITIALIZED => {
94 Err(NvTiffError::StatusError(NvTiffStatusError::NotInitialized))
95 }
96 nvtiffStatus_t::NVTIFF_STATUS_INVALID_PARAMETER => Err(NvTiffError::StatusError(
97 NvTiffStatusError::InvalidParameter,
98 )),
99 nvtiffStatus_t::NVTIFF_STATUS_BAD_TIFF => {
100 Err(NvTiffError::StatusError(NvTiffStatusError::BadTiff))
101 }
102 nvtiffStatus_t::NVTIFF_STATUS_TIFF_NOT_SUPPORTED => Err(NvTiffError::StatusError(
103 NvTiffStatusError::TiffNotSupported,
104 )),
105 nvtiffStatus_t::NVTIFF_STATUS_ALLOCATOR_FAILURE => Err(NvTiffError::StatusError(
106 NvTiffStatusError::AllocatorFailure,
107 )),
108 nvtiffStatus_t::NVTIFF_STATUS_EXECUTION_FAILED => {
109 Err(NvTiffError::StatusError(NvTiffStatusError::ExecutionFailed))
110 }
111 nvtiffStatus_t::NVTIFF_STATUS_ARCH_MISMATCH => {
112 Err(NvTiffError::StatusError(NvTiffStatusError::ArchMismatch))
113 }
114 nvtiffStatus_t::NVTIFF_STATUS_INTERNAL_ERROR => {
115 Err(NvTiffError::StatusError(NvTiffStatusError::InternalError))
116 }
117 nvtiffStatus_t::NVTIFF_STATUS_NVCOMP_NOT_FOUND => {
118 Err(NvTiffError::StatusError(NvTiffStatusError::NvcompNotFound))
119 }
120 nvtiffStatus_t::NVTIFF_STATUS_NVJPEG_NOT_FOUND => {
121 Err(NvTiffError::StatusError(NvTiffStatusError::NvjpegNotFound))
122 }
123 nvtiffStatus_t::NVTIFF_STATUS_TAG_NOT_FOUND => {
124 Err(NvTiffError::StatusError(NvTiffStatusError::TagNotFound))
125 }
126 nvtiffStatus_t::NVTIFF_STATUS_PARAMETER_OUT_OF_BOUNDS => Err(NvTiffError::StatusError(
127 NvTiffStatusError::ParameterOutOfBounds,
128 )),
129 nvtiffStatus_t::NVTIFF_STATUS_NVJPEG2K_NOT_FOUND => Err(NvTiffError::StatusError(
130 NvTiffStatusError::Nvjpeg2kNotFound,
131 )),
132 status_code => Err(NvTiffError::StatusError(NvTiffStatusError::Other(
134 status_code,
135 ))),
136 }
137 }
138}
139
140#[cfg(test)]
141mod tests {
142 use std::ffi::CString;
143
144 use crate::{
145 NvTiffResultCheck, nvtiffStatus_t, nvtiffStream, nvtiffStreamCreate,
146 nvtiffStreamGetNumImages, nvtiffStreamParseFromFile,
147 };
148
149 #[test]
150 fn test_nvtiff_status_result() {
151 let mut stream = std::mem::MaybeUninit::uninit();
152 let mut tiff_stream: *mut nvtiffStream = stream.as_mut_ptr();
153
154 let status_create: nvtiffStatus_t::Type =
156 unsafe { nvtiffStreamCreate(&raw mut tiff_stream) };
157 dbg!(status_create); assert!(status_create.result().is_ok());
159
160 let tiff_cstr = CString::new("images/invalid.tif").unwrap();
161 let tiff_path: *const std::os::raw::c_char = tiff_cstr.as_ptr();
162
163 let status_parse: nvtiffStatus_t::Type =
165 unsafe { nvtiffStreamParseFromFile(tiff_path, tiff_stream) };
166 dbg!(status_parse); assert!(status_parse.result().is_err());
168 }
169
170 #[test]
171 fn test_nvtiff_other_error() {
172 let status_unknown: nvtiffStatus_t::Type = 42; dbg!(status_unknown); assert!(status_unknown.result().is_err());
175 }
176
177 #[test]
178 fn nvtiff_status_to_string() {
179 let mut host_stream = std::mem::MaybeUninit::uninit();
180 let tiff_stream: *mut nvtiffStream = host_stream.as_mut_ptr();
181
182 let mut num_images: u32 = 0;
184 let status_numimages: u32 =
185 unsafe { nvtiffStreamGetNumImages(tiff_stream, &raw mut num_images) };
186 dbg!(status_numimages);
187
188 assert_eq!(
190 status_numimages.result().unwrap_err().to_string(),
191 "Status error: Wrong parameter was passed.".to_string()
192 );
193 }
194}