Skip to main content

interact/access/
mutex.rs

1use std::sync::Arc;
2use std::sync::Mutex;
3
4use crate::access::{Access, ReflectDirect};
5use crate::climber::{ClimbError, Climber};
6use crate::node_tree::{NodeInfo, NodeTree};
7use crate::reflector::Reflector;
8
9impl<T> ReflectDirect for Mutex<T>
10where
11    T: Access,
12{
13    fn immut_reflector(&self, reflector: &Arc<Reflector>) -> NodeTree {
14        match self.try_lock() {
15            Ok(locked) => Reflector::reflect(reflector, &*locked),
16            Err(_) => NodeInfo::Locked.into_node(),
17        }
18    }
19
20    fn immut_climber<'a>(&self, climber: &mut Climber<'a>) -> Result<Option<NodeTree>, ClimbError> {
21        climber.mutex_handling(self).map(Some)
22    }
23
24    fn mut_climber<'a>(
25        &mut self,
26        climber: &mut Climber<'a>,
27    ) -> Result<Option<NodeTree>, ClimbError> {
28        climber.mutex_handling(self).map(Some)
29    }
30}
31
32use interact_derive::derive_interact_opaque;
33
34derive_interact_opaque! {
35    struct Mutex<T>;
36}