toad_jni/java/util/
optional.rs1use core::marker::PhantomData;
2
3use crate::java;
4
5pub 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 unsafe { core::mem::transmute(self) }
20 }
21
22 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 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 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 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 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 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}