use jni::{JNIEnv, objects::JThrowable};
use crabdroid::{error::GlobalError, env::AndroidEnv};
use tesseract_one::Error as TError;
use jni::errors::Error as JError;
pub fn jni_error_to_tesseract(error: JError) -> TError {
TError::new(
tesseract_one::error::ErrorKind::Weird,
&format!("JNI Error: {}", error.to_string()),
error)
}
pub fn exception_to_tesseract<'a: 'b, 'b>(env: &'b JNIEnv<'a>, exception: JThrowable<'a>) -> jni::errors::Result<tesseract_one::Error> {
let user_cancelled_clazz = env.find_class_android("one/tesseract/exception/UserCancelledException")?;
let this_clazz = env.get_object_class(exception)?;
let is_cancelled = env.is_assignable_from(user_cancelled_clazz, this_clazz)?;
let message = env.call_method(exception, "getMessage", "()Ljava/lang/String;", &[])?.l()?;
let message: Option<String> = if message.is_null() {
None
} else {
Some(env.get_string(message.into())?.into())
};
debug!("PRINTME {:#?}", &message);
let kind = if is_cancelled {
debug!("ITISCANCELLED");
tesseract_one::ErrorKind::Cancelled
} else {
debug!("ITISWEIRD");
tesseract_one::ErrorKind::Weird
};
Ok(if let Some(message) = message {
TError::described(kind, &message)
} else {
TError::kinded(kind)
})
}
pub fn global_error_to_tesseract(error: GlobalError) -> tesseract_one::Error {
match error {
GlobalError::Exception(e) => {
let result = e.do_in_context_rret(64, |env, exception| {
exception_to_tesseract(&env, exception.into())
});
match result {
Ok(e) => e,
Err(e) => jni_error_to_tesseract(e)
}
},
GlobalError::JniError(e) => jni_error_to_tesseract(e)
}
}