tesseract_android_base/error/
tesseract.rs1use jni::{JNIEnv, objects::JThrowable};
2
3use crabdroid::{error::GlobalError, env::AndroidEnv};
4
5use tesseract_one::Error as TError;
6use jni::errors::Error as JError;
7
8pub fn jni_error_to_tesseract(error: JError) -> TError {
9 TError::new(
10 tesseract_one::error::ErrorKind::Weird,
11 &format!("JNI Error: {}", error.to_string()),
12 error)
13}
14
15pub fn exception_to_tesseract<'a: 'b, 'b>(env: &'b JNIEnv<'a>, exception: JThrowable<'a>) -> jni::errors::Result<tesseract_one::Error> {
16 let user_cancelled_clazz = env.find_class_android("one/tesseract/exception/UserCancelledException")?;
17 let this_clazz = env.get_object_class(exception)?;
18 let is_cancelled = env.is_assignable_from(user_cancelled_clazz, this_clazz)?;
19 let message = env.call_method(exception, "getMessage", "()Ljava/lang/String;", &[])?.l()?;
21 let message: Option<String> = if message.is_null() {
22 None
23 } else {
24 Some(env.get_string(message.into())?.into())
25 };
26
27 debug!("PRINTME {:#?}", &message);
28
29 let kind = if is_cancelled {
30 debug!("ITISCANCELLED");
31 tesseract_one::ErrorKind::Cancelled
32 } else {
33 debug!("ITISWEIRD");
34 tesseract_one::ErrorKind::Weird
35 };
36
37 Ok(if let Some(message) = message {
38 TError::described(kind, &message)
39 } else {
40 TError::kinded(kind)
41 })
42}
43
44pub fn global_error_to_tesseract(error: GlobalError) -> tesseract_one::Error {
45 match error {
46 GlobalError::Exception(e) => {
47 let result = e.do_in_context_rret(64, |env, exception| {
48 exception_to_tesseract(&env, exception.into())
49 });
50 match result {
51 Ok(e) => e,
52 Err(e) => jni_error_to_tesseract(e)
53 }
54 },
55 GlobalError::JniError(e) => jni_error_to_tesseract(e)
56 }
57}