data_router/
arc_linker.rs1pub 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}