2019-09-10 19:55:32 +00:00
|
|
|
#[derive(Debug)]
|
|
|
|
pub enum Error {
|
2019-09-10 23:15:20 +00:00
|
|
|
IOError(std::io::Error),
|
2019-09-10 19:55:32 +00:00
|
|
|
Misc(String),
|
2019-09-10 23:15:20 +00:00
|
|
|
Foreign(CppException),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<std::io::Error> for Error {
|
|
|
|
fn from(err: std::io::Error) -> Self {
|
|
|
|
Error::IOError(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<Error> for CppException {
|
|
|
|
fn from(err: Error) -> Self {
|
|
|
|
match err {
|
|
|
|
Error::Foreign(ex) => ex,
|
|
|
|
Error::Misc(s) => unsafe { make_error(&s) },
|
|
|
|
Error::IOError(err) => unsafe { make_error(&err.to_string()) },
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
#[derive(Debug)]
|
|
|
|
pub struct CppException(*const libc::c_void); // == std::exception_ptr*
|
|
|
|
|
|
|
|
extern "C" {
|
2019-09-11 10:44:31 +00:00
|
|
|
#[allow(improper_ctypes)] // YOLO
|
2019-09-10 23:15:20 +00:00
|
|
|
fn make_error(s: &str) -> CppException;
|
2019-09-10 19:55:32 +00:00
|
|
|
}
|