rustracing/
convert.rs

1//! Traits for conversions between types.
2
3/// A cheap reference-to-reference conversion that has a possibility to fail.
4pub trait MaybeAsRef<T: ?Sized> {
5    /// Performs the conversion.
6    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}