data_router/
arc_linker.rs

1pub mod arc_linked;
2
3use std::{
4    ops::Deref,
5    sync::{Arc, Mutex, MutexGuard},
6};
7
8use self::arc_linked::ArcLinked;
9
10#[derive(Clone)]
11pub struct ArcLinker<R> {
12    receiver: Arc<Mutex<Option<R>>>,
13}
14
15impl<R> ArcLinker<R> {
16    pub fn new(receiver: R) -> Self {
17        Self {
18            receiver: Arc::new(Mutex::new(Some(receiver))),
19        }
20    }
21
22    pub fn get_receiver(&self) -> &Mutex<Option<R>> {
23        self
24    }
25
26    pub fn lock(&self) -> MutexGuard<Option<R>> {
27        self.receiver.lock().unwrap()
28    }
29
30    pub fn linked(&self) -> ArcLinked<R> {
31        ArcLinked {
32            link: self.receiver.clone(),
33        }
34    }
35}
36
37impl<R> Deref for ArcLinker<R> {
38    type Target = Mutex<Option<R>>;
39
40    fn deref(&self) -> &Self::Target {
41        &self.receiver
42    }
43}
44
45impl<R> Drop for ArcLinker<R> {
46    fn drop(&mut self) {
47        *self.receiver.lock().unwrap() = None;
48    }
49}
50
51impl<R: Default> Default for ArcLinker<R> {
52    fn default() -> Self {
53        Self::new(R::default())
54    }
55}
56
57impl<R: std::fmt::Debug> std::fmt::Debug for ArcLinker<R> {
58    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
59        write!(
60            f,
61            "{{links: {}, receiver: {:?}}}",
62            Arc::strong_count(&self.receiver),
63            self.receiver
64        )
65    }
66}
67
68impl<R: std::fmt::Display> std::fmt::Display for ArcLinker<R> {
69    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
70        match self.receiver.try_lock() {
71            Ok(lock) => match lock.deref() {
72                Some(value) => value.fmt(f),
73                None => write!(f, "<deleted>"),
74            },
75            Err(_) => write!(f, "<locked>"),
76        }
77    }
78}