Skip to main content

lunar_lib/
disposable.rs

1pub struct Disposable<T> {
2    value: Option<T>,
3}
4
5impl<T> Disposable<T> {
6    pub fn new(value: T) -> Self {
7        Self { value: Some(value) }
8    }
9}
10
11impl<T> std::ops::Deref for Disposable<T> {
12    type Target = T;
13
14    fn deref(&self) -> &Self::Target {
15        self.value
16            .as_ref()
17            .expect("Attempted to use value after take")
18    }
19}
20
21impl<T> std::ops::DerefMut for Disposable<T> {
22    fn deref_mut(&mut self) -> &mut Self::Target {
23        self.value
24            .as_mut()
25            .expect("Attempted to use value after take")
26    }
27}
28
29impl<T> Disposable<T> {
30    /// Takes value out of the disposable wrapper
31    ///
32    /// # Panics
33    ///
34    /// This function will panic if the value has already been taken out
35    pub fn take(&mut self) -> T {
36        self.value.take().expect("Attempted to take value twice")
37    }
38
39    /// Tries to take the value out of the disposable wrapper.
40    ///
41    /// Returns [`None`] if the value has already been taken
42    pub fn try_take(&mut self) -> Option<T> {
43        self.value.take()
44    }
45}