1pub trait MaybeAsRef<T: ?Sized> {
5 fn maybe_as_ref(&self) -> Option<&T>;
7}
8impl<T, U> MaybeAsRef<T> for Option<U>
9where
10 U: MaybeAsRef<T>,
11{
12 fn maybe_as_ref(&self) -> Option<&T> {
13 self.as_ref().and_then(|u| u.maybe_as_ref())
14 }
15}
16
17#[cfg(test)]
18mod tests {
19 use super::*;
20
21 #[test]
22 fn it_works() {
23 struct Foo;
24 struct Bar(Foo);
25 impl MaybeAsRef<Foo> for Bar {
26 fn maybe_as_ref(&self) -> Option<&Foo> {
27 Some(&self.0)
28 }
29 }
30
31 let bar = Bar(Foo);
32 assert!(bar.maybe_as_ref().is_some());
33 }
34}