use crate::errors::LimboError; use jni::objects::{JByteArray, JObject}; use jni::JNIEnv; pub(crate) fn utf8_byte_arr_to_str( env: &JNIEnv, bytes: JByteArray, ) -> crate::errors::Result { let bytes = env .convert_byte_array(bytes) .map_err(|_| LimboError::CustomError("Failed to retrieve bytes".to_string()))?; let str = String::from_utf8(bytes).map_err(|_| { LimboError::CustomError("Failed to convert utf8 byte array into string".to_string()) })?; Ok(str) } /// Sets the error message and throws a Java exception. /// /// This function converts the provided error message to a byte array and calls the /// `throwLimboException` method on the provided Java object to throw an exception. /// /// # Parameters /// - `env`: The JNI environment. /// - `obj`: The Java object on which the exception will be thrown. /// - `err_code`: The error code corresponding to the exception. Refer to `tech.turso.core.Codes` for the list of error codes. /// - `err_msg`: The error message to be included in the exception. /// /// # Example /// ```rust /// set_err_msg_and_throw_exception(env, obj, Codes::SQLITE_ERROR, "An error occurred".to_string()); /// ``` pub fn set_err_msg_and_throw_exception<'local>( env: &mut JNIEnv<'local>, obj: JObject<'local>, err_code: i32, err_msg: String, ) { let error_message_bytes = env .byte_array_from_slice(err_msg.as_bytes()) .expect("Failed to convert to byte array"); match env.call_method( obj, "throwLimboException", "(I[B)V", &[err_code.into(), (&error_message_bytes).into()], ) { Ok(_) => { // do nothing because above method will always return Err } Err(_e) => { // do nothing because our java app will handle Err } } }