Skip to main content

interact/access/
btreemap.rs

1use 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}