1#![warn(missing_docs)]
3use crate::nvtiffStatus_t;
4
5pub type NvTiffResult<T> = Result<T, NvTiffError>;
7
8#[derive(Debug)]
10#[non_exhaustive]
11pub enum NvTiffError {
12 StatusError(NvTiffStatusError),
14}
15
16#[derive(Debug, Eq, PartialEq)]
21#[non_exhaustive]
22pub enum NvTiffStatusError {
23 NotInitialized, InvalidParameter, BadTiff, TiffNotSupported, AllocatorFailure, ExecutionFailed, ArchMismatch, InternalError, NvcompNotFound, NvjpegNotFound, TagNotFound, ParameterOutOfBounds, Nvjpeg2kNotFound, Other(u32),
55}
56
57pub trait NvTiffResultCheck {
59 fn result(self) -> NvTiffResult<()>;
64}
65
66impl NvTiffResultCheck for nvtiffStatus_t::Type {
67 fn result(self) -> NvTiffResult<()> {
74 match self {
75 nvtiffStatus_t::NVTIFF_STATUS_SUCCESS => Ok(()),
76 nvtiffStatus_t::NVTIFF_STATUS_NOT_INITIALIZED => {
77 Err(NvTiffError::StatusError(NvTiffStatusError::NotInitialized))
78 }
79 nvtiffStatus_t::NVTIFF_STATUS_INVALID_PARAMETER => Err(NvTiffError::StatusError(
80 NvTiffStatusError::InvalidParameter,
81 )),
82 nvtiffStatus_t::NVTIFF_STATUS_BAD_TIFF => {
83 Err(NvTiffError::StatusError(NvTiffStatusError::BadTiff))
84 }
85 nvtiffStatus_t::NVTIFF_STATUS_TIFF_NOT_SUPPORTED => Err(NvTiffError::StatusError(
86 NvTiffStatusError::TiffNotSupported,
87 )),
88 nvtiffStatus_t::NVTIFF_STATUS_ALLOCATOR_FAILURE => Err(NvTiffError::StatusError(
89 NvTiffStatusError::AllocatorFailure,
90 )),
91 nvtiffStatus_t::NVTIFF_STATUS_EXECUTION_FAILED => {
92 Err(NvTiffError::StatusError(NvTiffStatusError::ExecutionFailed))
93 }
94 nvtiffStatus_t::NVTIFF_STATUS_ARCH_MISMATCH => {
95 Err(NvTiffError::StatusError(NvTiffStatusError::ArchMismatch))
96 }
97 nvtiffStatus_t::NVTIFF_STATUS_INTERNAL_ERROR => {
98 Err(NvTiffError::StatusError(NvTiffStatusError::InternalError))
99 }
100 nvtiffStatus_t::NVTIFF_STATUS_NVCOMP_NOT_FOUND => {
101 Err(NvTiffError::StatusError(NvTiffStatusError::NvcompNotFound))
102 }
103 nvtiffStatus_t::NVTIFF_STATUS_NVJPEG_NOT_FOUND => {
104 Err(NvTiffError::StatusError(NvTiffStatusError::NvjpegNotFound))
105 }
106 nvtiffStatus_t::NVTIFF_STATUS_TAG_NOT_FOUND => {
107 Err(NvTiffError::StatusError(NvTiffStatusError::TagNotFound))
108 }
109 nvtiffStatus_t::NVTIFF_STATUS_PARAMETER_OUT_OF_BOUNDS => Err(NvTiffError::StatusError(
110 NvTiffStatusError::ParameterOutOfBounds,
111 )),
112 nvtiffStatus_t::NVTIFF_STATUS_NVJPEG2K_NOT_FOUND => Err(NvTiffError::StatusError(
113 NvTiffStatusError::Nvjpeg2kNotFound,
114 )),
115 status_code => Err(NvTiffError::StatusError(NvTiffStatusError::Other(
117 status_code,
118 ))),
119 }
120 }
121}
122
123#[cfg(test)]
124mod tests {
125 use std::ffi::CString;
126
127 use crate::{
128 NvTiffResultCheck, nvtiffStatus_t, nvtiffStream, nvtiffStreamCreate,
129 nvtiffStreamParseFromFile,
130 };
131
132 #[test]
133 fn test_nvtiff_status_result() {
134 let mut stream = std::mem::MaybeUninit::uninit();
135 let tiff_stream: *mut *mut nvtiffStream = stream.as_mut_ptr();
136
137 let status_create: nvtiffStatus_t::Type = unsafe { nvtiffStreamCreate(tiff_stream) };
139 dbg!(status_create); assert!(status_create.result().is_ok());
141
142 let tiff_cstr = CString::new("images/invalid.tif").unwrap();
143 let tiff_path: *const std::os::raw::c_char = tiff_cstr.as_ptr();
144
145 let status_parse: nvtiffStatus_t::Type =
147 unsafe { nvtiffStreamParseFromFile(tiff_path, *tiff_stream) };
148 dbg!(status_parse); assert!(status_parse.result().is_err());
150 }
151
152 #[test]
153 fn test_nvtiff_other_error() {
154 let status_unknown: nvtiffStatus_t::Type = 42; dbg!(status_unknown); assert!(status_unknown.result().is_err());
157 }
158}