use jni::objects::{JByteArray, JObject, JString};
use crate::prelude::*;
use super::*;
use crate::exception::*;
pub trait IntoRustType<'local, T> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<T>;
}
impl<'local> IntoRustType<'local, bool> for jni::sys::jboolean {
fn into_rust(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<bool> {
Ok(self == jni::sys::JNI_TRUE)
}
}
impl<'local> IntoRustType<'local, u8> for jni::sys::jbyte {
fn into_rust(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<u8> {
Ok(self as u8)
}
}
impl<'local> IntoRustType<'local, i8> for jni::sys::jbyte {
fn into_rust(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<i8> {
Ok(self)
}
}
impl<'local> IntoRustType<'local, char> for jni::sys::jchar {
fn into_rust(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<char> {
char::from_u32(self as u32).ok_or(JException::from_class_and_msg(
JExceptionClass::ClassCastException,
"u32 to char",
))
}
}
impl<'local> IntoRustType<'local, u16> for jni::sys::jchar {
fn into_rust(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<u16> {
Ok(self)
}
}
impl<'local> IntoRustType<'local, i16> for jni::sys::jshort {
fn into_rust(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<i16> {
Ok(self)
}
}
impl<'local> IntoRustType<'local, i32> for jni::sys::jint {
fn into_rust(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<i32> {
Ok(self)
}
}
impl<'local> IntoRustType<'local, i64> for jni::sys::jlong {
fn into_rust(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<i64> {
Ok(self)
}
}
impl<'local> IntoRustType<'local, f32> for jni::sys::jfloat {
fn into_rust(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<f32> {
Ok(self)
}
}
impl<'local> IntoRustType<'local, f64> for jni::sys::jdouble {
fn into_rust(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<f64> {
Ok(self)
}
}
impl<'local> IntoRustType<'local, Vec<u8>> for JByteArray<'local> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<Vec<u8>> {
env.convert_byte_array(self)
.j_catch_ini(env, "Cast failed [JByteArray -> Vec<u8>]")
}
}
impl<'local> IntoRustType<'local, String> for JString<'local> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<String> {
env.get_string_owned(&self)
.j_catch_ini(env, "Cast failed [JString -> String]")
}
}
impl<'local> IntoRustType<'local, String> for JObject<'local> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<String> {
let j_string = JString::from(self);
env.get_string_owned(&j_string)
.j_catch_ini(env, "Cast failed [JObject -> String]")
}
}
impl<'local> IntoRustType<'local, u8> for jni::objects::JValueGen<JObject<'local>> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<u8> {
let b = self.b().j_catch_ini(env, "Cast failed [JObject -> u8]")?;
Ok(b as u8)
}
}
impl<'local> IntoRustType<'local, i8> for jni::objects::JValueGen<JObject<'local>> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<i8> {
self.b().j_catch_ini(env, "Cast failed [JObject -> i8]")
}
}
impl<'local> IntoRustType<'local, i16> for jni::objects::JValueGen<JObject<'local>> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<i16> {
self.s().j_catch_ini(env, "Cast failed [JObject -> i16]")
}
}
impl<'local> IntoRustType<'local, i32> for jni::objects::JValueGen<JObject<'local>> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<i32> {
self.i().j_catch_ini(env, "Cast failed [JObject -> i32]")
}
}
impl<'local> IntoRustType<'local, i64> for jni::objects::JValueGen<JObject<'local>> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<i64> {
self.j().j_catch_ini(env, "Cast failed [JObject -> i64]")
}
}
impl<'local> IntoRustType<'local, f32> for jni::objects::JValueGen<JObject<'local>> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<f32> {
self.f().j_catch_ini(env, "Cast failed [JObject -> f32]")
}
}
impl<'local> IntoRustType<'local, f64> for jni::objects::JValueGen<JObject<'local>> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<f64> {
self.d().j_catch_ini(env, "Cast failed [JObject -> f64]")
}
}
impl<'local> IntoRustType<'local, bool> for jni::objects::JValueGen<JObject<'local>> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<bool> {
self.z().j_catch_ini(env, "Cast failed [JObject -> bool]")
}
}
impl<'local> IntoRustType<'local, char> for jni::objects::JValueGen<JObject<'local>> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<char> {
let char = self.c().j_catch_ini(env, "Cast failed [JObject -> char]")?;
char.into_rust(env)
}
}
impl<'local> IntoRustType<'local, String> for jni::objects::JValueGen<JObject<'local>> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<String> {
let obj = self.l().j_catch_ini(env, "Cast failed [JObject -> String]")?;
obj.into_rust(env)
}
}
impl<'local> IntoRustType<'local, Vec<u8>> for jni::objects::JValueGen<JObject<'local>> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<Vec<u8>> {
let obj = self.l()?;
obj.into_rust(env)
}
}
macro_rules! JValueGen_obj_to_class_primitive_impl {
($rust_type:tt) => {
impl<'local> IntoRustType<'local, $rust_type>
for jni::objects::JValueGen<JObject<'local>>
{
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<$rust_type> {
let obj = self.l()?;
let byte = obj.into_rust(env)?;
Ok($rust_type(byte))
}
}
};
}
JValueGen_obj_to_class_primitive_impl!(JByte);
JValueGen_obj_to_class_primitive_impl!(JShort);
JValueGen_obj_to_class_primitive_impl!(JInt);
JValueGen_obj_to_class_primitive_impl!(JLong);
JValueGen_obj_to_class_primitive_impl!(JFloat);
JValueGen_obj_to_class_primitive_impl!(JDouble);
JValueGen_obj_to_class_primitive_impl!(JBoolean);
JValueGen_obj_to_class_primitive_impl!(JChar);
macro_rules! obj_to_class_primitive_impl {
($rust_type:tt) => {
impl<'local> IntoRustType<'local, $rust_type> for jni::objects::JObject<'local> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<$rust_type> {
let value = self.into_rust(env)?;
Ok($rust_type(value))
}
}
};
}
obj_to_class_primitive_impl!(JByte);
obj_to_class_primitive_impl!(JShort);
obj_to_class_primitive_impl!(JInt);
obj_to_class_primitive_impl!(JLong);
obj_to_class_primitive_impl!(JFloat);
obj_to_class_primitive_impl!(JDouble);
obj_to_class_primitive_impl!(JBoolean);
obj_to_class_primitive_impl!(JChar);
impl<'local> IntoRustType<'local, u8> for JObject<'local> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<u8> {
let value: u8 = self.call_getter("byteValue", env)?;
Ok(value)
}
}
impl<'local> IntoRustType<'local, i8> for JObject<'local> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<i8> {
let value: u8 = self.call_getter("byteValue", env)?;
Ok(value as i8)
}
}
impl<'local> IntoRustType<'local, i16> for JObject<'local> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<i16> {
let value: i16 = self.call_getter("shortValue", env)?;
Ok(value)
}
}
impl<'local> IntoRustType<'local, i32> for JObject<'local> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<i32> {
let value = self.call_getter("intValue", env)?;
Ok(value)
}
}
impl<'local> IntoRustType<'local, i64> for JObject<'local> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<i64> {
let value = self.call_getter("longValue", env)?;
Ok(value)
}
}
impl<'local> IntoRustType<'local, f32> for JObject<'local> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<f32> {
let value = self.call_getter("floatValue", env)?;
Ok(value)
}
}
impl<'local> IntoRustType<'local, f64> for JObject<'local> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<f64> {
let value = self.call_getter("doubleValue", env)?;
Ok(value)
}
}
impl<'local> IntoRustType<'local, char> for JObject<'local> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<char> {
let value = self.call_getter("charValue", env)?;
Ok(value)
}
}
impl<'local> IntoRustType<'local, bool> for JObject<'local> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<bool> {
let value = self.call_getter("booleanValue", env)?;
Ok(value)
}
}
impl<'local> IntoRustType<'local, Vec<u8>> for JObject<'local> {
fn into_rust(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<Vec<u8>> {
JByteArray::from(self).into_rust(env)
}
}
impl<'local> IntoRustType<'local, JString<'local>> for JString<'local> {
fn into_rust(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<JString<'local>> {
Ok(self)
}
}
impl<'local> IntoRustType<'local, JByteArray<'local>> for JByteArray<'local> {
fn into_rust(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<JByteArray<'local>> {
Ok(self)
}
}
impl<'local> IntoRustType<'local, JObject<'local>> for JObject<'local> {
fn into_rust(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
Ok(self)
}
}