cotis_modules_debug/declaration_debugger/
debug_element_configuring.rs1use cotis::element_configuring::{
9 ConfigureElements, ConfigureLeafElements, ConfiguredParentElement, OpenElement,
10};
11use serde::Serialize;
12
13use crate::serialize_targets::LeafedInterfaceDeclaration;
14
15pub struct DebugInitialConfiguredParentElement<
22 'b,
23 'element,
24 Configurer: ConfigureElements<ConfigType>,
25 ConfigType: Clone + Serialize,
26 List: Copy,
27> {
28 internal: &'b mut ConfiguredParentElement<'element, Configurer, ConfigType>,
29 interface_recorder: &'b mut LeafedInterfaceDeclaration<ConfigType, List>,
30}
31
32impl<
33 'b,
34 'element,
35 Configurer: ConfigureElements<ConfigType>,
36 ConfigType: Clone + Serialize,
37 List: Copy,
38> DebugInitialConfiguredParentElement<'b, 'element, Configurer, ConfigType, List>
39{
40 pub fn new(
42 internal: &'b mut ConfiguredParentElement<'element, Configurer, ConfigType>,
43 interface_recorder: &'b mut LeafedInterfaceDeclaration<ConfigType, List>,
44 ) -> Self {
45 Self {
46 internal,
47 interface_recorder,
48 }
49 }
50
51 pub fn new_element(&'_ mut self) -> DebugOpenElement<'_, Configurer, ConfigType, List>
55 where
56 Self: Sized,
57 {
58 self.interface_recorder.open();
59
60 let new_element = self.internal.new_element();
61 DebugOpenElement {
62 internal: Some(new_element),
63 interface_recorder: Some(&mut self.interface_recorder),
64 }
65 }
66
67 pub fn close_element(self) {
72 self.interface_recorder.close();
73 }
74}
75
76pub struct DebugConfiguredParentElement<
81 'element,
82 Configurer: ConfigureElements<ConfigType>,
83 ConfigType: Clone + Serialize,
84 List: Copy,
85> {
86 internal: ConfiguredParentElement<'element, Configurer, ConfigType>,
87 interface_recorder: &'element mut LeafedInterfaceDeclaration<ConfigType, List>,
88}
89
90impl<'element, Configurer: ConfigureElements<ConfigType>, ConfigType: Clone + Serialize, List: Copy>
91 DebugConfiguredParentElement<'element, Configurer, ConfigType, List>
92{
93 pub fn new(
95 internal: ConfiguredParentElement<'element, Configurer, ConfigType>,
96 interface_recorder: &'element mut LeafedInterfaceDeclaration<ConfigType, List>,
97 ) -> Self {
98 Self {
99 internal,
100 interface_recorder,
101 }
102 }
103
104 pub fn new_element(&'_ mut self) -> DebugOpenElement<'_, Configurer, ConfigType, List>
106 where
107 Self: Sized,
108 {
109 self.interface_recorder.open();
110
111 let new_element = self.internal.new_element();
112 DebugOpenElement {
113 internal: Some(new_element),
114 interface_recorder: Some(&mut self.interface_recorder),
115 }
116 }
117
118 pub fn close_element(self) {
122 drop(self)
123 }
124}
125
126pub struct DebugOpenElement<
132 'element,
133 Configurer: ConfigureElements<ConfigType>,
134 ConfigType: Clone + Serialize,
135 List: Copy,
136> {
137 internal: Option<OpenElement<'element, Configurer, ConfigType>>,
138 interface_recorder: Option<&'element mut LeafedInterfaceDeclaration<ConfigType, List>>,
139}
140
141impl<'element, ConfigType: Clone + Serialize, Configurer: ConfigureElements<ConfigType>, List: Copy>
142 DebugOpenElement<'element, Configurer, ConfigType, List>
143{
144 pub fn set_config(&mut self, config: ConfigType) {
146 self.interface_recorder
147 .as_mut()
148 .unwrap()
149 .add_config(config.clone());
150 self.internal.as_mut().unwrap().set_config(config);
151 }
152
153 pub fn make_parent(
157 mut self,
158 ) -> DebugConfiguredParentElement<'element, Configurer, ConfigType, List> {
159 DebugConfiguredParentElement {
160 internal: self.internal.take().unwrap().make_parent(),
161 interface_recorder: self.interface_recorder.take().unwrap(),
162 }
163 }
164
165 pub fn close_element(self) {
169 drop(self)
170 }
171
172 pub fn set_leaf_config<LeafConfig>(mut self, config: LeafConfig)
177 where
178 Configurer: ConfigureLeafElements<LeafConfig>,
179 LeafConfig: Serialize,
180 {
181 self.interface_recorder
182 .as_mut()
183 .unwrap()
184 .add_leaf_config(&config);
185 self.internal.take().unwrap().set_leaf_config(config);
186 }
187}
188
189impl<'element, Configurer: ConfigureElements<ConfigType>, ConfigType: Clone + Serialize, List: Copy>
191 Drop for DebugOpenElement<'element, Configurer, ConfigType, List>
192{
193 fn drop(&mut self) {
194 match &mut self.interface_recorder {
195 None => {}
196 Some(recorder) => {
197 recorder.close();
198 }
199 }
200 }
201}
202
203impl<'element, ConfigType: Clone + Serialize, Configurer: ConfigureElements<ConfigType>, List: Copy>
205 Drop for DebugConfiguredParentElement<'element, Configurer, ConfigType, List>
206{
207 fn drop(&mut self) {
208 self.interface_recorder.close();
209 }
210}