toad_jni/java/
nullable.rs

1use std::marker::PhantomData;
2
3use crate::java;
4
5/// Helper type that wraps a type `T` without
6/// invoking [`java::Object::upcast`] on it, preventing
7/// potential NullPointerExceptions.
8pub struct Nullable<T>(java::lang::Object, PhantomData<T>);
9
10impl<T> Nullable<T> where T: java::Class
11{
12  /// Convert this to [`Option`]`<T>`, invoking [`java::Object::upcast`]
13  /// _only_ if the object reference is non-null.
14  pub fn into_option(self, e: &mut java::Env) -> Option<T> {
15    if self.0.is_null() {
16      None
17    } else {
18      Some(self.0.upcast_to::<T>(e))
19    }
20  }
21}
22
23impl<T> java::Class for Nullable<T> where T: java::Class
24{
25  const PATH: &'static str = T::PATH;
26}
27
28impl<T> java::Object for Nullable<T> where T: java::Class
29{
30  fn upcast(_: &mut java::Env, jobj: java::lang::Object) -> Self {
31    Self(jobj, PhantomData)
32  }
33
34  fn downcast(self, _: &mut java::Env) -> java::lang::Object {
35    self.0
36  }
37
38  fn downcast_ref(&self, e: &mut java::Env) -> java::lang::Object {
39    self.0.downcast_ref(e)
40  }
41}