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