1use std::borrow::Cow;
2use std::sync::Arc;
3
4use crate::access::ReflectDirect;
5use crate::climber::{ClimbError, Climber};
6use crate::node_tree::{NodeInfo, NodeTree};
7use crate::reflector::Reflector;
8
9use interact_derive::derive_interact_basic;
10
11macro_rules! simple {
12 ($a:tt, $fmt:expr) => {
13 derive_interact_basic! {
14 #[interact(mut_assign)]
15 struct $a;
16 }
17
18 impl ReflectDirect for $a {
19 fn immut_reflector(&self, reflector: &Arc<Reflector>) -> NodeTree {
20 let obj_ptr = ((self as *const _) as usize, 0);
21 let meta = match Reflector::seen_ptr(reflector, obj_ptr) {
22 Ok(v) => return v,
23 Err(meta) => meta,
24 };
25 NodeInfo::Leaf(Cow::Owned(format!($fmt, self))).with_meta(meta)
26 }
27
28 fn immut_climber<'a>(
29 &self,
30 _climber: &mut Climber<'a>,
31 ) -> Result<Option<NodeTree>, ClimbError> {
32 Ok(None)
33 }
34
35 fn mut_climber<'a>(
36 &mut self,
37 _climber: &mut Climber<'a>,
38 ) -> Result<Option<NodeTree>, ClimbError> {
39 Ok(None)
40 }
41 }
42 };
43}
44
45simple!(usize, "{}");
46simple!(u64, "{}");
47simple!(u32, "{}");
48simple!(u16, "{}");
49simple!(u8, "{}");
50simple!(isize, "{}");
51simple!(bool, "{}");
52simple!(String, "{:?}");
53simple!(char, "{:?}");
54simple!(i64, "{}");
55simple!(i32, "{}");
56simple!(i16, "{}");
57simple!(i8, "{}");