use core::fmt;
use crate::ffi;
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum VisionError {
ImageLoadFailed(String),
RequestFailed(String),
InvalidArgument(String),
Unknown { code: i32, message: String },
}
impl fmt::Display for VisionError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::ImageLoadFailed(m) => write!(f, "image load failed: {m}"),
Self::RequestFailed(m) => write!(f, "Vision request failed: {m}"),
Self::InvalidArgument(m) => write!(f, "invalid argument: {m}"),
Self::Unknown { code, message } => write!(f, "vision error {code}: {message}"),
}
}
}
impl std::error::Error for VisionError {}
pub(crate) unsafe fn from_swift(status: i32, error_str: *mut core::ffi::c_char) -> VisionError {
let message = if error_str.is_null() {
String::new()
} else {
let s = core::ffi::CStr::from_ptr(error_str)
.to_string_lossy()
.into_owned();
ffi::vn_string_free(error_str);
s
};
match status {
ffi::status::IMAGE_LOAD_FAILED => VisionError::ImageLoadFailed(message),
ffi::status::REQUEST_FAILED => VisionError::RequestFailed(message),
ffi::status::INVALID_ARGUMENT => VisionError::InvalidArgument(message),
code => VisionError::Unknown { code, message },
}
}