use crate::class::Class;
use crate::object::Object;
use jni::errors::Result;
use jni::sys::_jobject;
use jni::JNIEnv;
pub struct MapEntry<'a> {
pub inner: Object<'a>,
pub k_class: Class<'a>,
pub v_class: Class<'a>,
env: &'a JNIEnv<'a>,
}
#[allow(clippy::from_over_into)]
impl<'a> Into<*mut _jobject> for MapEntry<'a> {
fn into(self) -> *mut _jobject {
self.inner.inner.into_inner()
}
}
impl<'a> Drop for MapEntry<'a> {
fn drop(&mut self) {
let _ = self.env.delete_local_ref(self.inner.inner);
}
}
impl<'a> MapEntry<'a> {
pub fn new(
env: &'a JNIEnv<'a>,
object: Object<'a>,
k_class: Class<'a>,
v_class: Class<'a>,
) -> Self {
Self {
inner: object,
k_class,
v_class,
env,
}
}
pub fn get_key(&self) -> Result<Option<Object<'a>>> {
let key = self
.env
.call_method(self.inner.inner, "getKey", "()Ljava/lang/Object;", &[])?;
let object = Object::new(self.env, key.l()?, self.k_class.clone());
match object.inner.is_null() {
true => Ok(None),
false => Ok(Some(object)),
}
}
pub fn get_value(&self) -> Result<Option<Object<'a>>> {
let value =
self.env
.call_method(self.inner.inner, "getValue", "()Ljava/lang/Object;", &[])?;
let object = Object::new(self.env, value.l()?, self.v_class.clone());
match object.inner.is_null() {
true => Ok(None),
false => Ok(Some(object)),
}
}
}