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