lunar-lib 0.12.0

Common utilities for lunar applications
Documentation
pub struct Disposable<T> {
    value: Option<T>,
}

impl<T> Disposable<T> {
    pub fn new(value: T) -> Self {
        Self { value: Some(value) }
    }
}

impl<T> std::ops::Deref for Disposable<T> {
    type Target = T;

    fn deref(&self) -> &Self::Target {
        self.value
            .as_ref()
            .expect("Attempted to use value after take")
    }
}

impl<T> std::ops::DerefMut for Disposable<T> {
    fn deref_mut(&mut self) -> &mut Self::Target {
        self.value
            .as_mut()
            .expect("Attempted to use value after take")
    }
}

impl<T> Disposable<T> {
    /// Takes value out of the disposable wrapper
    ///
    /// # Panics
    ///
    /// This function will panic if the value has already been taken out
    pub fn take(&mut self) -> T {
        self.value.take().expect("Attempted to take value twice")
    }

    /// Tries to take the value out of the disposable wrapper.
    ///
    /// Returns [`None`] if the value has already been taken
    pub fn try_take(&mut self) -> Option<T> {
        self.value.take()
    }
}