tesseract_android_base/error/
tesseract.rs

1use 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    //is_instance_of(exception, clazz)?;
20    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}