1use std::{ffi::CStr, fmt, io};
2use vaal_sys as ffi;
3
4#[derive(Debug, Clone)]
5pub enum Error {
6 VAALError(&'static str),
7 WrapperError(String),
8 Null(),
9 IoError(io::ErrorKind),
10}
11
12impl From<ffi::VAALError> for Error {
13 fn from(value: ffi::VAALError) -> Self {
14 let ret = unsafe { ffi::vaal_strerror(value) };
15 if ret.is_null() {
16 return Error::Null();
17 }
18 let desc = unsafe { CStr::from_ptr(ret) };
19 match desc.to_str() {
20 Ok(estr) => return Error::VAALError(estr),
21 Err(_) => return Error::Null(),
22 }
23 }
24}
25
26impl fmt::Display for Error {
27 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
28 match self {
29 Error::VAALError(e) => return write!(f, "{}", e),
30 Error::WrapperError(e) => return write!(f, "{}", e),
31 Error::Null() => return write!(f, "null/unknown error message unavailable"),
32 Error::IoError(kind) => {
33 let e = std::io::Error::from(*kind);
34 return write!(f, "{}", e);
35 }
36 }
37 }
38}
39
40impl std::error::Error for Error {}