toad_jni/java/util/
optional.rs

1use core::marker::PhantomData;
2
3use crate::java;
4
5/// java/util/Optional
6pub struct Optional<T>(java::lang::Object, PhantomData<T>);
7
8impl<T> Optional<T> where T: java::Object
9{
10  fn cast<R>(self) -> Optional<R> {
11    Optional(self.0, PhantomData)
12  }
13
14  fn cast_ref<R>(&self) -> &Optional<R> {
15    // SAFETY:
16    // this is safe because there are no values of type `T`
17    // stored in this struct; simply just casting the PhantomData
18    // to a different PhantomData.
19    unsafe { core::mem::transmute(self) }
20  }
21
22  /// java.util.Optional$of
23  pub fn of(e: &mut java::Env, t: T) -> Self {
24    #[allow(clippy::type_complexity)]
25    static OF: java::StaticMethod<Optional<java::lang::Object>,
26                                    fn(java::lang::Object) -> Optional<java::lang::Object>> =
27      java::StaticMethod::new("of");
28    let t = t.downcast(e);
29    OF.invoke(e, t).cast()
30  }
31
32  /// Create an empty instance of `Optional<T>`
33  pub fn empty(e: &mut java::Env) -> Self {
34    static EMPTY: java::StaticMethod<Optional<java::lang::Object>,
35                                       fn() -> Optional<java::lang::Object>> =
36      java::StaticMethod::new("empty");
37    EMPTY.invoke(e).cast()
38  }
39
40  /// Is this Optional empty? (equivalent to [`Option.is_none`])
41  pub fn is_empty(&self, e: &mut java::Env) -> bool {
42    static IS_EMPTY: java::Method<Optional<java::lang::Object>, fn() -> bool> =
43      java::Method::new("isEmpty");
44    IS_EMPTY.invoke(e, self.cast_ref())
45  }
46
47  /// Extract the value from the optional, throwing a Java exception if it was empty.
48  ///
49  /// (equivalent to [`Option.unwrap`])
50  pub fn get(&self, e: &mut java::Env) -> T {
51    static GET: java::Method<Optional<java::lang::Object>, fn() -> java::lang::Object> =
52      java::Method::new("get");
53    GET.invoke(e, self.cast_ref()).upcast_to::<T>(e)
54  }
55
56  /// Infallibly convert this java `Optional<T>` to a rust `Option<T>`.
57  pub fn to_option(self, e: &mut java::Env) -> Option<T> {
58    if self.is_empty(e) {
59      None
60    } else {
61      Some(self.get(e))
62    }
63  }
64
65  /// Infallibly convert create a java `Optional<T>` from a rust `Option<T>`.
66  pub fn from_option(o: Option<T>, e: &mut java::Env) -> Self {
67    o.map(|t| Self::of(e, t)).unwrap_or_else(|| Self::empty(e))
68  }
69}
70
71impl<T> java::Class for Optional<T> where T: java::Object
72{
73  const PATH: &'static str = "java/util/Optional";
74}
75
76impl<T> java::Object for Optional<T> where T: java::Object
77{
78  fn upcast(_e: &mut java::Env, jobj: java::lang::Object) -> Self {
79    Self(jobj, PhantomData)
80  }
81
82  fn downcast(self, _e: &mut java::Env) -> java::lang::Object {
83    self.0
84  }
85
86  fn downcast_ref(&self, e: &mut java::Env) -> java::lang::Object {
87    self.0.downcast_ref(e)
88  }
89}