Skip to main content

android_activity/
error.rs

1use thiserror::Error;
2
3#[derive(Error, Debug)]
4pub enum AppError {
5    #[error("Operation only supported from the android_main() thread: {0}")]
6    NonMainThread(String),
7
8    #[error("Java VM or JNI error, including Java exceptions")]
9    JavaError(String),
10
11    #[error("Input unavailable")]
12    InputUnavailable,
13}
14
15pub type Result<T> = std::result::Result<T, AppError>;
16
17// XXX: we don't want to expose jni-rs in the public API
18// so we have an internal error type that we can generally
19// use in the backends and then we can strip the error
20// in the frontend of the API.
21//
22// This way we avoid exposing a public trait implementation for
23// `From<jni::errors::Error>`
24#[derive(Error, Debug)]
25pub(crate) enum InternalAppError {
26    #[error("A JNI error")]
27    JniError(jni::errors::JniError),
28    // For internal errors that don't lead to a Java exception but are
29    // still JNI related.
30    #[error("A bad argument was passed to a JNI method: {0}")]
31    JniBadArgument(String),
32    #[error("A Java VM error")]
33    JvmError(jni::errors::Error),
34    #[error("Input unavailable")]
35    InputUnavailable,
36}
37
38pub(crate) type InternalResult<T> = std::result::Result<T, InternalAppError>;
39
40impl From<jni::errors::Error> for InternalAppError {
41    fn from(value: jni::errors::Error) -> Self {
42        InternalAppError::JvmError(value)
43    }
44}
45impl From<jni::errors::JniError> for InternalAppError {
46    fn from(value: jni::errors::JniError) -> Self {
47        InternalAppError::JniError(value)
48    }
49}
50
51impl From<InternalAppError> for AppError {
52    fn from(value: InternalAppError) -> Self {
53        match value {
54            InternalAppError::JniError(err) => AppError::JavaError(err.to_string()),
55            InternalAppError::JniBadArgument(msg) => AppError::JavaError(msg),
56            InternalAppError::JvmError(err) => AppError::JavaError(err.to_string()),
57            InternalAppError::InputUnavailable => AppError::InputUnavailable,
58        }
59    }
60}