diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-05-22 18:43:49 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-05-23 10:30:03 +0000 |
| commit | 2f40aca85164bf2aab597cb2b04ea877e3288723 (patch) | |
| tree | 0d0e991dcb51e8e568aee9be1a9f142e8d4c9e24 /mullvad-jni/src/from_java.rs | |
| parent | 276a5df145025567ef908173d9c692bb30422308 (diff) | |
| download | mullvadvpn-2f40aca85164bf2aab597cb2b04ea877e3288723.tar.xz mullvadvpn-2f40aca85164bf2aab597cb2b04ea877e3288723.zip | |
Implement `FromJava` for `Constraint`
Diffstat (limited to 'mullvad-jni/src/from_java.rs')
| -rw-r--r-- | mullvad-jni/src/from_java.rs | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/mullvad-jni/src/from_java.rs b/mullvad-jni/src/from_java.rs index 11b98ad753..7a87e10884 100644 --- a/mullvad-jni/src/from_java.rs +++ b/mullvad-jni/src/from_java.rs @@ -1,8 +1,10 @@ +use crate::get_class; use jni::{ objects::{JObject, JString}, JNIEnv, }; -use std::ops::Deref; +use mullvad_types::relay_constraints::Constraint; +use std::{fmt::Debug, ops::Deref}; pub trait FromJava<'env> { type JavaType: 'env; @@ -36,3 +38,46 @@ impl<'env> FromJava<'env> for String { ) } } + +impl<'env, T> FromJava<'env> for Constraint<T> +where + T: Clone + Debug + Eq + FromJava<'env>, + T::JavaType: From<JObject<'env>>, +{ + type JavaType = JObject<'env>; + + fn from_java(env: &JNIEnv<'env>, source: Self::JavaType) -> Self { + if is_instance_of(env, source, "net/mullvad/mullvadvpn/model/Constraint$Any") { + Constraint::Any + } else if is_instance_of(env, source, "net/mullvad/mullvadvpn/model/Constraint$Only") { + let value = get_object_field(env, source, "value", "Ljava/lang/Object;"); + + Constraint::Only(T::from_java(env, T::JavaType::from(value))) + } else { + panic!("Invalid Constraint Java sub-class"); + } + } +} + +fn is_instance_of<'env>( + env: &JNIEnv<'env>, + object: JObject<'env>, + class_name: &'static str, +) -> bool { + let class = get_class(class_name); + + env.is_instance_of(object, &class) + .expect("Failed to check if an object is an instance of a specified class") +} + +fn get_object_field<'env>( + env: &JNIEnv<'env>, + object: JObject<'env>, + field_name: &str, + field_type: &str, +) -> JObject<'env> { + env.get_field(object, field_name, field_type) + .expect("Failed to get field from object") + .l() + .expect("Field has incorrect Java type") +} |
