// Huge thanks to @jam1gamer for this hack: // https://twitter.com/jam1garner/status/1515887996444323840 #[doc(hidden)] pub trait IsOption {} impl IsOption for Option {} #[doc(hidden)] #[derive(Debug, Default)] pub struct OptionalWrapper(pub core::marker::PhantomData); impl OptionalWrapper { pub fn new() -> Self { Self(core::marker::PhantomData) } } #[doc(hidden)] pub trait ToOption { #[doc(hidden)] fn to_option(self, value: T) -> Option; } impl OptionalWrapper where T: IsOption, { #[doc(hidden)] pub fn to_option(self, value: &T) -> &T { value } } impl ToOption for &OptionalWrapper { fn to_option(self, value: U) -> Option { Some(value) } }