Skip to main content

interact/access/
tuple.rs

1use std::borrow::Cow;
2use std::sync::Arc;
3
4use crate::access::{
5    derive::{ReflectStruct, Struct, StructKind},
6    Access, AssignError, ImmutAccess, MutAccess, Reflect, ReflectDirect, ReflectMut,
7};
8use crate::climber::{ClimbError, Climber, EnumOrStruct, EnumOrStructMut};
9use crate::deser::{self, Deser};
10use crate::node_tree::{NodeInfo, NodeTree};
11use crate::reflector::Reflector;
12
13macro_rules! tuple {
14    ($count:expr; { $(($n:ident, $i:tt)),* }) => {
15
16        impl<$($n),*> ReflectStruct for ($($n),*)
17            where $($n : Access),*
18        {
19            fn get_desc(&self) -> Struct {
20                Struct {
21                    name: "",
22                    kind: StructKind::Tuple($count),
23                }
24            }
25
26            fn get_field_by_name(&self, _: &'static str) -> Option<&dyn Access> {
27                None
28            }
29
30            fn get_field_by_idx(&self, idx: usize) -> Option<&dyn Access> {
31                $(if idx == $i { return Some(&self.$i) });*
32                None
33            }
34
35            fn get_field_by_name_mut(&mut self, _: &'static str) -> Option<&mut dyn Access> {
36                None
37            }
38
39            fn get_field_by_idx_mut(&mut self, idx: usize) -> Option<&mut dyn Access> {
40                $(if idx == $i { return Some(&mut self.$i) });*
41                None
42            }
43        }
44
45        impl<$($n),*> ReflectDirect for ($($n),*)
46            where $($n : Access),*
47        {
48            fn immut_reflector(&self, reflector: &Arc<Reflector>) -> NodeTree {
49                Reflector::reflect_struct(reflector, &self.get_desc(), self, true)
50            }
51
52            fn immut_climber<'a>(
53                &self,
54                climber: &mut Climber<'a>,
55            ) -> Result<Option<NodeTree>, ClimbError> {
56                climber.check_field_access_immut(&EnumOrStruct::Struct(self))
57            }
58
59            fn mut_climber<'a>(
60                &mut self,
61                climber: &mut Climber<'a>,
62            ) -> Result<Option<NodeTree>, ClimbError> {
63                climber.check_field_access_mut(EnumOrStructMut::Struct(self))
64            }
65        }
66
67        impl<$($n),*> Access for ($($n),*)
68            where $($n : Access + Deser),*
69        {
70            fn immut_access(&self) -> ImmutAccess {
71                ImmutAccess::no_funcs(Reflect::Direct(self))
72            }
73
74            fn mut_access(&mut self) -> MutAccess {
75                MutAccess::no_funcs(ReflectMut::Direct(self))
76            }
77
78            mut_assign_deser!();
79        }
80    }
81}
82
83impl<A> ReflectStruct for (A,)
84where
85    A: Access,
86{
87    fn get_desc(&self) -> Struct {
88        Struct {
89            name: "",
90            kind: StructKind::Tuple(1),
91        }
92    }
93
94    fn get_field_by_name(&self, _: &'static str) -> Option<&dyn Access> {
95        None
96    }
97
98    fn get_field_by_idx(&self, idx: usize) -> Option<&dyn Access> {
99        if idx == 0 {
100            return Some(&self.0);
101        }
102        None
103    }
104
105    fn get_field_by_name_mut(&mut self, _: &'static str) -> Option<&mut dyn Access> {
106        None
107    }
108
109    fn get_field_by_idx_mut(&mut self, idx: usize) -> Option<&mut dyn Access> {
110        if idx == 0 {
111            return Some(&mut self.0);
112        }
113        None
114    }
115}
116
117impl<T> ReflectDirect for (T,)
118where
119    T: Access,
120{
121    fn immut_reflector(&self, reflector: &Arc<Reflector>) -> NodeTree {
122        Reflector::reflect_struct(reflector, &self.get_desc(), self, true)
123    }
124
125    fn immut_climber<'a>(&self, climber: &mut Climber<'a>) -> Result<Option<NodeTree>, ClimbError> {
126        climber.check_field_access_immut(&EnumOrStruct::Struct(self))
127    }
128
129    fn mut_climber<'a>(
130        &mut self,
131        climber: &mut Climber<'a>,
132    ) -> Result<Option<NodeTree>, ClimbError> {
133        climber.check_field_access_mut(EnumOrStructMut::Struct(self))
134    }
135}
136
137impl<A> Access for (A,)
138where
139    A: Access + Deser,
140{
141    fn immut_access(&self) -> ImmutAccess {
142        ImmutAccess::no_funcs(Reflect::Direct(self))
143    }
144
145    fn mut_access(&mut self) -> MutAccess {
146        MutAccess::no_funcs(ReflectMut::Direct(self))
147    }
148
149    mut_assign_deser!();
150}
151
152impl ReflectDirect for () {
153    fn immut_reflector(&self, reflector: &Arc<Reflector>) -> NodeTree {
154        let obj_ptr = ((self as *const _) as usize, 0);
155        let meta = match Reflector::seen_ptr(reflector, obj_ptr) {
156            Ok(v) => return v,
157            Err(meta) => meta,
158        };
159        NodeInfo::Leaf(Cow::Borrowed("()")).with_meta(meta)
160    }
161
162    fn immut_climber<'a>(
163        &self,
164        _climber: &mut Climber<'a>,
165    ) -> Result<Option<NodeTree>, ClimbError> {
166        Ok(None)
167    }
168
169    fn mut_climber<'a>(
170        &mut self,
171        _climber: &mut Climber<'a>,
172    ) -> Result<Option<NodeTree>, ClimbError> {
173        Ok(None)
174    }
175}
176
177impl Access for () {
178    fn immut_access(&self) -> ImmutAccess {
179        ImmutAccess::no_funcs(Reflect::Direct(self))
180    }
181
182    fn mut_access(&mut self) -> MutAccess {
183        MutAccess::no_funcs(ReflectMut::Direct(self))
184    }
185
186    mut_assign_deser!();
187}
188
189tuple!(2; {(A, 0), (B, 1)});
190tuple!(3; {(A, 0), (B, 1), (C, 2)});
191tuple!(4; {(A, 0), (B, 1), (C, 2), (D, 3)});
192tuple!(5; {(A, 0), (B, 1), (C, 2), (D, 3), (E, 4)});
193tuple!(6; {(A, 0), (B, 1), (C, 2), (D, 3), (E, 4), (F, 5)});
194tuple!(7; {(A, 0), (B, 1), (C, 2), (D, 3), (E, 4), (F, 5), (G, 6)});
195tuple!(8; {(A, 0), (B, 1), (C, 2), (D, 3), (E, 4), (F, 5), (G, 6), (H, 7)});
196tuple!(9; {(A, 0), (B, 1), (C, 2), (D, 3), (E, 4), (F, 5), (G, 6), (H, 7), (I, 8)});
197tuple!(10; {(A, 0), (B, 1), (C, 2), (D, 3), (E, 4), (F, 5), (G, 6), (H, 7), (I, 8), (J, 9)});