use jni::JNIEnv;
use jni::sys::jlong;
pub enum RiJavaException {
RiErrors,
ConfigError,
ValidationError,
AuthError,
DatabaseError,
CacheError,
NetworkError,
NullPointerError,
IllegalArgumentError,
}
impl RiJavaException {
pub fn class_name(&self) -> &'static str {
match self {
RiJavaException::RiErrors => "com/dunimd/ri/RiError",
RiJavaException::ConfigError => "com/dunimd/ri/RiConfigError",
RiJavaException::ValidationError => "com/dunimd/ri/validation/RiValidationError",
RiJavaException::AuthError => "com/dunimd/ri/auth/RiAuthError",
RiJavaException::DatabaseError => "com/dunimd/ri/database/RiDatabaseError",
RiJavaException::CacheError => "com/dunimd/ri/cache/RiCacheError",
RiJavaException::NetworkError => "com/dunimd/ri/RiNetworkError",
RiJavaException::NullPointerError => "java/lang/NullPointerException",
RiJavaException::IllegalArgumentError => "java/lang/IllegalArgumentException",
}
}
}
pub fn throw_exception(env: &mut JNIEnv, exception_type: RiJavaException, message: &str) {
let class_name = exception_type.class_name();
if let Err(e) = env.throw_new(class_name, message) {
eprintln!("Failed to throw Java exception: {:?}", e);
}
}
pub fn throw_ri_error(env: &mut JNIEnv, message: &str) {
throw_exception(env, RiJavaException::RiErrors, message);
}
pub fn throw_null_pointer(env: &mut JNIEnv, message: &str) {
throw_exception(env, RiJavaException::NullPointerError, message);
}
pub fn throw_illegal_argument(env: &mut JNIEnv, message: &str) {
throw_exception(env, RiJavaException::IllegalArgumentError, message);
}
pub fn check_not_null(env: &mut JNIEnv, ptr: jlong, context: &str) -> bool {
if ptr == 0 {
throw_null_pointer(env, &format!("{} pointer is null", context));
false
} else {
true
}
}
#[macro_export]
macro_rules! check_java_ptr {
($env:expr, $ptr:expr, $context:expr) => {
if !$crate::java::exception::check_not_null($env, $ptr, $context) {
return;
}
};
}
#[macro_export]
macro_rules! check_java_ptr_or_default {
($env:expr, $ptr:expr, $context:expr, $default:expr) => {
if !$crate::java::exception::check_not_null($env, $ptr, $context) {
return $default;
}
};
}