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)});