fieldx 0.2.3

Procedural macro for constructing structs with lazily initialized fields, builder pattern, and serde support with a focus on declarative syntax.
Documentation
use std::borrow::Borrow;
use std::borrow::BorrowMut;
use std::fmt;
use std::ops::Deref;
use std::ops::DerefMut;

pub struct FXProxyReadGuard<G, T>
where
    G: Deref<Target = Option<T>>,
{
    guard: G,
}

impl<G, T> FXProxyReadGuard<G, T>
where
    G: Deref<Target = Option<T>>,
{
    pub fn new(guard: G) -> Self {
        Self { guard }
    }
}

impl<G, T> Deref for FXProxyReadGuard<G, T>
where
    G: Deref<Target = Option<T>>,
{
    type Target = T;

    fn deref(&self) -> &Self::Target {
        self.guard.deref().as_ref().unwrap()
    }
}

impl<G, T> AsRef<T> for FXProxyReadGuard<G, T>
where
    G: Deref<Target = Option<T>>,
{
    fn as_ref(&self) -> &T {
        self.guard.deref().as_ref().unwrap()
    }
}

impl<G, T> Borrow<T> for FXProxyReadGuard<G, T>
where
    G: Deref<Target = Option<T>>,
{
    fn borrow(&self) -> &T {
        self.guard.deref().as_ref().unwrap()
    }
}

impl<G, T> fmt::Debug for FXProxyReadGuard<G, T>
where
    G: Deref<Target = Option<T>>,
    T: fmt::Debug,
{
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        self.guard.deref().as_ref().unwrap().fmt(f)
    }
}

pub struct FXProxyWriteGuard<G, T>
where
    G: DerefMut<Target = Option<T>> + Deref<Target = Option<T>>,
{
    guard: G,
}

impl<G, T> FXProxyWriteGuard<G, T>
where
    G: DerefMut<Target = Option<T>> + Deref<Target = Option<T>>,
{
    pub fn new(guard: G) -> Self {
        Self { guard }
    }
}

impl<G, T> Deref for FXProxyWriteGuard<G, T>
where
    G: DerefMut<Target = Option<T>> + Deref<Target = Option<T>>,
{
    type Target = T;

    fn deref(&self) -> &Self::Target {
        self.guard.deref().as_ref().unwrap()
    }
}

impl<G, T> AsRef<T> for FXProxyWriteGuard<G, T>
where
    G: DerefMut<Target = Option<T>> + Deref<Target = Option<T>>,
{
    fn as_ref(&self) -> &T {
        self.guard.deref().as_ref().unwrap()
    }
}

impl<G, T> Borrow<T> for FXProxyWriteGuard<G, T>
where
    G: DerefMut<Target = Option<T>> + Deref<Target = Option<T>>,
{
    fn borrow(&self) -> &T {
        self.guard.deref().as_ref().unwrap()
    }
}

impl<G, T> DerefMut for FXProxyWriteGuard<G, T>
where
    G: DerefMut<Target = Option<T>> + Deref<Target = Option<T>>,
{
    fn deref_mut(&mut self) -> &mut Self::Target {
        self.guard.deref_mut().as_mut().unwrap()
    }
}

impl<G, T> AsMut<T> for FXProxyWriteGuard<G, T>
where
    G: DerefMut<Target = Option<T>> + Deref<Target = Option<T>>,
{
    fn as_mut(&mut self) -> &mut T {
        self.guard.deref_mut().as_mut().unwrap()
    }
}

impl<G, T> BorrowMut<T> for FXProxyWriteGuard<G, T>
where
    G: DerefMut<Target = Option<T>> + Deref<Target = Option<T>>,
{
    fn borrow_mut(&mut self) -> &mut T {
        self.guard.deref_mut().as_mut().unwrap()
    }
}

impl<G, T> fmt::Debug for FXProxyWriteGuard<G, T>
where
    G: DerefMut<Target = Option<T>> + Deref<Target = Option<T>>,
    T: fmt::Debug,
{
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        self.guard.deref().as_ref().unwrap().fmt(f)
    }
}