use crate::sys;
use std::ffi::{IntoStringError, NulError};
use std::fmt::Display;
use std::str::Utf8Error;
#[derive(Debug, Clone)]
pub enum Error {
APIError(sys::Error, String),
ErrorCodeGetError(sys::Error),
StringConversionError(String),
MemoryError(String),
}
impl Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Error::APIError(error_code, error_string) => {
write!(f, "API Error: \"{}\" ({:?})", error_string, error_code)
}
Error::ErrorCodeGetError(error_code) => write!(
f,
"Failed to get error code description for error code: {:?}",
error_code
),
Error::StringConversionError(error_string) => {
write!(f, "String Conversion Error: \"{}\"", error_string)
}
Error::MemoryError(error_string) => {
write!(f, "Memory Error: \"{}\"", error_string)
}
}
}
}
impl From<Utf8Error> for Error {
fn from(error: Utf8Error) -> Self {
Error::StringConversionError(format!("UTF-8 conversion error: {}", error))
}
}
impl From<NulError> for Error {
fn from(error: NulError) -> Self {
Error::StringConversionError(format!("Nul byte found in string: {}", error))
}
}
impl From<IntoStringError> for Error {
fn from(error: IntoStringError) -> Self {
Error::StringConversionError(format!("Failed to convert CString to String: {}", error))
}
}
impl From<sys::InvalidEnumValue> for Error {
fn from(error: sys::InvalidEnumValue) -> Self {
Error::StringConversionError(format!("{}", error))
}
}
impl std::error::Error for Error {}
pub type Result<T> = core::result::Result<T, Error>;