async_resource/resource/
managed.rs1use 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 .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 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 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}