async_resource/resource/
managed.rs

1use std::fmt::{self, Debug, Display, Formatter};
2use std::ops::{Deref, DerefMut};
3use std::sync::Arc;
4
5use super::{ResourceGuard, ResourceInfo};
6use crate::shared::Shared;
7
8pub struct Managed<T> {
9    shared: Option<Arc<Shared<T>>>,
10    value: Option<ResourceGuard<T>>,
11}
12
13impl<T> Managed<T> {
14    pub(crate) fn new(value: ResourceGuard<T>, shared: Arc<Shared<T>>) -> Self {
15        Self {
16            shared: Some(shared),
17            value: Some(value),
18        }
19    }
20
21    pub fn discard(mng_self: &mut Self) {
22        mng_self.value.as_mut().unwrap().discard()
23    }
24
25    pub fn info(mng_self: &Self) -> &ResourceInfo {
26        mng_self.value.as_ref().unwrap().info()
27    }
28}
29
30impl<T: Debug> Debug for Managed<T> {
31    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
32        if f.alternate() {
33            f.debug_struct("ManagedResource")
34                .field("value", &self.deref())
35                // .field("info", &self.info)
36                .finish()
37        } else {
38            Debug::fmt(self.deref(), f)
39        }
40    }
41}
42
43impl<T: Display> Display for Managed<T> {
44    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
45        Display::fmt(self.deref(), f)
46    }
47}
48
49impl<T> Deref for Managed<T> {
50    type Target = T;
51    fn deref(&self) -> &Self::Target {
52        // note: panics after drop when value is taken
53        self.value.as_ref().unwrap().as_ref().unwrap()
54    }
55}
56
57impl<T> DerefMut for Managed<T> {
58    fn deref_mut(&mut self) -> &mut Self::Target {
59        // note: panics after drop when value is taken
60        self.value.as_mut().unwrap().as_mut().unwrap()
61    }
62}
63
64impl<T> Drop for Managed<T> {
65    fn drop(&mut self) {
66        if let Some(shared) = self.shared.take() {
67            shared.release(self.value.take().unwrap());
68        }
69    }
70}