#![warn(missing_docs)]
use thiserror::Error;
use crate::nvtiffStatus;
pub type NvTiffResult<T> = Result<T, NvTiffError>;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum NvTiffError {
#[error("Status error: {0}")]
StatusError(NvTiffStatusError),
}
#[derive(Debug, Eq, Error, PartialEq)]
#[non_exhaustive]
pub enum NvTiffStatusError {
#[error("The library handle was not initialized.")]
NotInitialized, #[error("Wrong parameter was passed.")]
InvalidParameter, #[error("Cannot parse the TIFF stream.")]
BadTiff, #[error("Attempting to decode a TIFF stream that is not supported by the nvTIFF library.")]
TiffNotSupported, #[error("The user-provided allocator functions returned a non-zero code.")]
AllocatorFailure, #[error("Error during the execution of the device tasks.")]
ExecutionFailed, #[error("The device capabilities are not enough for the set of input parameters provided.")]
ArchMismatch, #[error("Unknown error occured in the library.")]
InternalError, #[error("nvTiff is unable to load the nvCOMP library.")]
NvcompNotFound, #[error("nvTiff is unable to load the nvJPEG library.")]
NvjpegNotFound, #[error("nvTiff is unable to find information about the provided tag.")]
TagNotFound, #[error("Provided parameter is outside the range of possible values.")]
ParameterOutOfBounds, #[error("nvTiff is unable to load the nvJPEG2000 library.")]
Nvjpeg2kNotFound,
#[error("Unknown nvTiff error with status code {0}")]
Other(u32),
}
pub trait NvTiffResultCheck {
fn result(self) -> NvTiffResult<()>;
}
impl NvTiffResultCheck for nvtiffStatus::Type {
fn result(self) -> NvTiffResult<()> {
match self {
nvtiffStatus::NVTIFF_STATUS_SUCCESS => Ok(()),
nvtiffStatus::NVTIFF_STATUS_NOT_INITIALIZED => {
Err(NvTiffError::StatusError(NvTiffStatusError::NotInitialized))
}
nvtiffStatus::NVTIFF_STATUS_INVALID_PARAMETER => Err(NvTiffError::StatusError(
NvTiffStatusError::InvalidParameter,
)),
nvtiffStatus::NVTIFF_STATUS_BAD_TIFF => {
Err(NvTiffError::StatusError(NvTiffStatusError::BadTiff))
}
nvtiffStatus::NVTIFF_STATUS_TIFF_NOT_SUPPORTED => Err(NvTiffError::StatusError(
NvTiffStatusError::TiffNotSupported,
)),
nvtiffStatus::NVTIFF_STATUS_ALLOCATOR_FAILURE => Err(NvTiffError::StatusError(
NvTiffStatusError::AllocatorFailure,
)),
nvtiffStatus::NVTIFF_STATUS_EXECUTION_FAILED => {
Err(NvTiffError::StatusError(NvTiffStatusError::ExecutionFailed))
}
nvtiffStatus::NVTIFF_STATUS_ARCH_MISMATCH => {
Err(NvTiffError::StatusError(NvTiffStatusError::ArchMismatch))
}
nvtiffStatus::NVTIFF_STATUS_INTERNAL_ERROR => {
Err(NvTiffError::StatusError(NvTiffStatusError::InternalError))
}
nvtiffStatus::NVTIFF_STATUS_NVCOMP_NOT_FOUND => {
Err(NvTiffError::StatusError(NvTiffStatusError::NvcompNotFound))
}
nvtiffStatus::NVTIFF_STATUS_NVJPEG_NOT_FOUND => {
Err(NvTiffError::StatusError(NvTiffStatusError::NvjpegNotFound))
}
nvtiffStatus::NVTIFF_STATUS_TAG_NOT_FOUND => {
Err(NvTiffError::StatusError(NvTiffStatusError::TagNotFound))
}
nvtiffStatus::NVTIFF_STATUS_PARAMETER_OUT_OF_BOUNDS => Err(NvTiffError::StatusError(
NvTiffStatusError::ParameterOutOfBounds,
)),
nvtiffStatus::NVTIFF_STATUS_NVJPEG2K_NOT_FOUND => Err(NvTiffError::StatusError(
NvTiffStatusError::Nvjpeg2kNotFound,
)),
status_code => Err(NvTiffError::StatusError(NvTiffStatusError::Other(
status_code,
))),
}
}
}
#[cfg(test)]
mod tests {
use std::ffi::CString;
use crate::{
NvTiffResultCheck, nvtiffStatus, nvtiffStream, nvtiffStreamCreate,
nvtiffStreamGetNumImages, nvtiffStreamParseFromFile,
};
#[test]
fn nvtiff_status_result() {
let mut stream = std::mem::MaybeUninit::uninit();
let mut tiff_stream: *mut nvtiffStream = stream.as_mut_ptr();
let status_create: nvtiffStatus::Type = unsafe { nvtiffStreamCreate(&raw mut tiff_stream) };
dbg!(status_create); assert!(status_create.result().is_ok());
let tiff_cstr = CString::new("images/invalid.tif").unwrap();
let tiff_path: *const std::os::raw::c_char = tiff_cstr.as_ptr();
let status_parse: nvtiffStatus::Type =
unsafe { nvtiffStreamParseFromFile(tiff_path, tiff_stream) };
dbg!(status_parse); assert!(status_parse.result().is_err());
}
#[test]
fn nvtiff_other_error() {
let status_unknown: nvtiffStatus::Type = 42; dbg!(status_unknown); assert!(status_unknown.result().is_err());
}
#[test]
fn status_to_string() {
let mut host_stream = std::mem::MaybeUninit::uninit();
let tiff_stream: *mut nvtiffStream = host_stream.as_mut_ptr();
let mut num_images: u32 = 0;
let status_numimages: u32 =
unsafe { nvtiffStreamGetNumImages(tiff_stream, &raw mut num_images) };
dbg!(status_numimages);
assert_eq!(
status_numimages.result().unwrap_err().to_string(),
"Status error: Wrong parameter was passed.".to_string()
);
}
}