// SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: Copyright The LanceDB Authors use jni::objects::{JMap, JObject, JString, JValue}; use jni::JNIEnv; use crate::Result; pub trait FromJObject { fn extract(&self) -> Result; } /// Convert a Rust type into a Java Object. pub trait IntoJava { fn into_java<'a>(self, env: &mut JNIEnv<'a>) -> JObject<'a>; } impl FromJObject for JObject<'_> { fn extract(&self) -> Result { Ok(JValue::from(self).i()?) } } impl FromJObject for JObject<'_> { fn extract(&self) -> Result { Ok(JValue::from(self).j()?) } } impl FromJObject for JObject<'_> { fn extract(&self) -> Result { Ok(JValue::from(self).f()?) } } impl FromJObject for JObject<'_> { fn extract(&self) -> Result { Ok(JValue::from(self).d()?) } } pub trait FromJString { fn extract(&self, env: &mut JNIEnv) -> Result; } impl FromJString for JString<'_> { fn extract(&self, env: &mut JNIEnv) -> Result { Ok(env.get_string(self)?.into()) } } pub trait JMapExt { #[allow(dead_code)] fn get_string(&self, env: &mut JNIEnv, key: &str) -> Result>; #[allow(dead_code)] fn get_i32(&self, env: &mut JNIEnv, key: &str) -> Result>; #[allow(dead_code)] fn get_i64(&self, env: &mut JNIEnv, key: &str) -> Result>; #[allow(dead_code)] fn get_f32(&self, env: &mut JNIEnv, key: &str) -> Result>; #[allow(dead_code)] fn get_f64(&self, env: &mut JNIEnv, key: &str) -> Result>; } fn get_map_value(env: &mut JNIEnv, map: &JMap, key: &str) -> Result> where for<'a> JObject<'a>: FromJObject, { let key_obj: JObject = env.new_string(key)?.into(); if let Some(value) = map.get(env, &key_obj)? { if value.is_null() { Ok(None) } else { Ok(Some(value.extract()?)) } } else { Ok(None) } } impl JMapExt for JMap<'_, '_, '_> { fn get_string(&self, env: &mut JNIEnv, key: &str) -> Result> { let key_obj: JObject = env.new_string(key)?.into(); if let Some(value) = self.get(env, &key_obj)? { let value_str: JString = value.into(); Ok(Some(value_str.extract(env)?)) } else { Ok(None) } } fn get_i32(&self, env: &mut JNIEnv, key: &str) -> Result> { get_map_value(env, self, key) } fn get_i64(&self, env: &mut JNIEnv, key: &str) -> Result> { get_map_value(env, self, key) } fn get_f32(&self, env: &mut JNIEnv, key: &str) -> Result> { get_map_value(env, self, key) } fn get_f64(&self, env: &mut JNIEnv, key: &str) -> Result> { get_map_value(env, self, key) } }