1 // Huge thanks to @jam1gamer for this hack:
2 // https://twitter.com/jam1garner/status/1515887996444323840
3 
4 #[doc(hidden)]
5 pub trait IsOption {}
6 impl<T> IsOption for Option<T> {}
7 
8 #[doc(hidden)]
9 #[derive(Debug, Default)]
10 pub struct OptionalWrapper<T>(pub core::marker::PhantomData<T>);
11 
12 impl<T> OptionalWrapper<T> {
new() -> Self13     pub fn new() -> Self {
14         Self(core::marker::PhantomData)
15     }
16 }
17 
18 #[doc(hidden)]
19 pub trait ToOption {
20     #[doc(hidden)]
to_option<T>(self, value: T) -> Option<T>21     fn to_option<T>(self, value: T) -> Option<T>;
22 }
23 
24 impl<T> OptionalWrapper<T>
25 where
26     T: IsOption,
27 {
28     #[doc(hidden)]
to_option(self, value: &T) -> &T29     pub fn to_option(self, value: &T) -> &T {
30         value
31     }
32 }
33 
34 impl<T> ToOption for &OptionalWrapper<T> {
to_option<U>(self, value: U) -> Option<U>35     fn to_option<U>(self, value: U) -> Option<U> {
36         Some(value)
37     }
38 }
39