interact/access/
btreemap.rs1use std::collections::BTreeMap;
2use std::sync::Arc;
3
4use crate::access::{iter::ReflectIter, Access, ReflectDirect};
5use crate::climber::{ClimbError, Climber};
6use crate::deser;
7use crate::node_tree::NodeTree;
8use crate::reflector::Reflector;
9
10impl<'a, K, V> ReflectIter<(&'a dyn Access, &'a dyn Access)>
11 for std::collections::btree_map::Iter<'a, K, V>
12where
13 K: Eq + Access,
14 V: Access,
15{
16 fn reflect_next(&mut self) -> Option<(&'a dyn Access, &'a dyn Access)> {
17 match self.next() {
18 None => None,
19 Some((key, value)) => Some((key, value)),
20 }
21 }
22}
23
24impl<K, V> ReflectDirect for BTreeMap<K, V>
25where
26 K: Eq + Ord + Access + deser::Deser,
27 V: Access,
28{
29 fn immut_reflector(&self, reflector: &Arc<Reflector>) -> NodeTree {
30 let mut i = Box::new(self.iter());
31 Reflector::reflect_map(reflector, &mut *i, "BTreeMap")
32 }
33
34 fn immut_climber<'a>(&self, climber: &mut Climber<'a>) -> Result<Option<NodeTree>, ClimbError> {
35 if !climber.open_bracket() {
36 return Ok(None);
37 }
38
39 let v = K::deser(&mut climber.borrow_tracker())
40 .map(|x| <BTreeMap<K, V>>::get(self, &x))
41 .map(|x| x.map(|y| y as &dyn Access));
42 let v = match v {
43 Ok(None) => return Err(ClimbError::NotFound),
44 Err(err) => return Err(ClimbError::DeserError(err)),
45 Ok(Some(v)) => v,
46 };
47
48 climber.close_bracket()?;
49
50 return climber.general_access_immut(v).map(Some);
51 }
52
53 fn mut_climber<'a>(
54 &mut self,
55 climber: &mut Climber<'a>,
56 ) -> Result<Option<NodeTree>, ClimbError> {
57 if !climber.open_bracket() {
58 return Ok(None);
59 }
60
61 let v = match K::deser(&mut climber.borrow_tracker()) {
62 Ok(x) => Ok(match <BTreeMap<K, V>>::get_mut(self, &x) {
63 None => None,
64 Some(x) => Some(x),
65 }),
66 Err(e) => Err(e),
67 };
68 let v = match v {
69 Ok(None) => return Err(ClimbError::NotFound),
70 Err(err) => return Err(ClimbError::DeserError(err)),
71 Ok(Some(v)) => v,
72 };
73
74 climber.close_bracket()?;
75
76 return climber.general_access_mut(v).map(Some);
77 }
78}
79
80use interact_derive::derive_interact_opaque;
81
82derive_interact_opaque! {
83 #[interact(immut_fn(len()))]
84 struct BTreeMap<K, V>
85 where
86 K: Eq + Ord + deser::Deser;
87}