haste_reflect/
primitives.rs

1use crate::traits::MetaValue;
2use std::any::Any;
3
4/**
5 * 067  public static final String FP_String = "http://hl7.org/fhirpath/System.String";
6 * 068  public static final String FP_Boolean = "http://hl7.org/fhirpath/System.Boolean";
7 * 069  public static final String FP_Integer = "http://hl7.org/fhirpath/System.Integer";
8 * 070  public static final String FP_Decimal = "http://hl7.org/fhirpath/System.Decimal";
9 * 071  public static final String FP_Quantity = "http://hl7.org/fhirpath/System.Quantity";
10 * 072  public static final String FP_DateTime = "http://hl7.org/fhirpath/System.DateTime";
11 * 073  public static final String FP_Time = "http://hl7.org/fhirpath/System.Time";
12 */
13
14impl MetaValue for i64 {
15    fn fields(&self) -> Vec<&'static str> {
16        vec![]
17    }
18
19    fn get_field<'a>(&'a self, _field: &str) -> Option<&'a dyn MetaValue> {
20        None
21    }
22
23    fn get_index<'a>(&'a self, _index: usize) -> Option<&'a dyn MetaValue> {
24        None
25    }
26
27    fn get_field_mut<'a>(&'a mut self, _field: &str) -> Option<&'a mut dyn MetaValue> {
28        None
29    }
30
31    fn get_index_mut<'a>(&'a mut self, _index: usize) -> Option<&'a mut dyn MetaValue> {
32        None
33    }
34
35    fn typename(&self) -> &'static str {
36        "http://hl7.org/fhirpath/System.Integer"
37    }
38
39    fn as_any(&self) -> &dyn Any {
40        self
41    }
42
43    fn flatten(&self) -> Vec<&dyn MetaValue> {
44        vec![self]
45    }
46}
47
48impl MetaValue for u64 {
49    fn fields(&self) -> Vec<&'static str> {
50        vec![]
51    }
52
53    fn get_field<'a>(&'a self, _field: &str) -> Option<&'a dyn MetaValue> {
54        None
55    }
56
57    fn get_index<'a>(&'a self, _index: usize) -> Option<&'a dyn MetaValue> {
58        None
59    }
60
61    fn get_field_mut<'a>(&'a mut self, _field: &str) -> Option<&'a mut dyn MetaValue> {
62        None
63    }
64
65    fn get_index_mut<'a>(&'a mut self, _index: usize) -> Option<&'a mut dyn MetaValue> {
66        None
67    }
68
69    fn typename(&self) -> &'static str {
70        "http://hl7.org/fhirpath/System.Integer"
71    }
72
73    fn as_any(&self) -> &dyn Any {
74        self
75    }
76
77    fn flatten(&self) -> Vec<&dyn MetaValue> {
78        vec![self]
79    }
80}
81
82impl MetaValue for f64 {
83    fn fields(&self) -> Vec<&'static str> {
84        vec![]
85    }
86
87    fn get_field<'a>(&'a self, _field: &str) -> Option<&'a dyn MetaValue> {
88        None
89    }
90
91    fn get_index<'a>(&'a self, _index: usize) -> Option<&'a dyn MetaValue> {
92        None
93    }
94
95    fn get_field_mut<'a>(&'a mut self, _field: &str) -> Option<&'a mut dyn MetaValue> {
96        None
97    }
98
99    fn get_index_mut<'a>(&'a mut self, _index: usize) -> Option<&'a mut dyn MetaValue> {
100        None
101    }
102
103    fn typename(&self) -> &'static str {
104        "http://hl7.org/fhirpath/System.Decimal"
105    }
106
107    fn as_any(&self) -> &dyn Any {
108        self
109    }
110
111    fn flatten(&self) -> Vec<&dyn MetaValue> {
112        vec![self]
113    }
114}
115
116impl MetaValue for bool {
117    fn fields(&self) -> Vec<&'static str> {
118        vec![]
119    }
120
121    fn get_field<'a>(&'a self, _field: &str) -> Option<&'a dyn MetaValue> {
122        None
123    }
124
125    fn get_index<'a>(&'a self, _index: usize) -> Option<&'a dyn MetaValue> {
126        None
127    }
128
129    fn get_field_mut<'a>(&'a mut self, _field: &str) -> Option<&'a mut dyn MetaValue> {
130        None
131    }
132
133    fn get_index_mut<'a>(&'a mut self, _index: usize) -> Option<&'a mut dyn MetaValue> {
134        None
135    }
136
137    fn typename(&self) -> &'static str {
138        "http://hl7.org/fhirpath/System.Boolean"
139    }
140
141    fn as_any(&self) -> &dyn Any {
142        self
143    }
144
145    fn flatten(&self) -> Vec<&dyn MetaValue> {
146        vec![self]
147    }
148}
149
150impl MetaValue for String {
151    fn fields(&self) -> Vec<&'static str> {
152        vec![]
153    }
154
155    fn get_field<'a>(&'a self, _field: &str) -> Option<&'a dyn MetaValue> {
156        None
157    }
158
159    fn get_index<'a>(&'a self, _index: usize) -> Option<&'a dyn MetaValue> {
160        None
161    }
162
163    fn get_field_mut<'a>(&'a mut self, _field: &str) -> Option<&'a mut dyn MetaValue> {
164        None
165    }
166
167    fn get_index_mut<'a>(&'a mut self, _index: usize) -> Option<&'a mut dyn MetaValue> {
168        None
169    }
170
171    fn typename(&self) -> &'static str {
172        "http://hl7.org/fhirpath/System.String"
173    }
174
175    fn as_any(&self) -> &dyn Any {
176        self
177    }
178
179    fn flatten(&self) -> Vec<&dyn MetaValue> {
180        vec![self]
181    }
182}
183
184impl MetaValue for &'static str {
185    fn fields(&self) -> Vec<&'static str> {
186        vec![]
187    }
188
189    fn get_field<'a>(&'a self, _field: &str) -> Option<&'a dyn MetaValue> {
190        None
191    }
192
193    fn get_index<'a>(&'a self, _index: usize) -> Option<&'a dyn MetaValue> {
194        None
195    }
196
197    fn get_field_mut<'a>(&'a mut self, _field: &str) -> Option<&'a mut dyn MetaValue> {
198        None
199    }
200
201    fn get_index_mut<'a>(&'a mut self, _index: usize) -> Option<&'a mut dyn MetaValue> {
202        None
203    }
204
205    fn typename(&self) -> &'static str {
206        "http://hl7.org/fhirpath/System.String"
207    }
208
209    fn as_any(&self) -> &dyn Any {
210        self
211    }
212
213    fn flatten(&self) -> Vec<&dyn MetaValue> {
214        vec![self]
215    }
216}
217
218impl<T> MetaValue for Vec<T>
219where
220    T: MetaValue,
221{
222    fn fields(&self) -> Vec<&'static str> {
223        if let Some(first) = self.first() {
224            first.fields()
225        } else {
226            vec![]
227        }
228    }
229
230    fn get_field<'a>(&'a self, _field: &str) -> Option<&'a dyn MetaValue> {
231        None
232    }
233
234    fn get_index<'a>(&'a self, index: usize) -> Option<&'a dyn MetaValue> {
235        if self.get(index).is_some() {
236            let k: &dyn MetaValue = &self[index];
237            Some(k)
238        } else {
239            None
240        }
241    }
242
243    fn get_field_mut<'a>(&'a mut self, _field: &str) -> Option<&'a mut dyn MetaValue> {
244        None
245    }
246
247    fn get_index_mut<'a>(&'a mut self, index: usize) -> Option<&'a mut dyn MetaValue> {
248        if self.get(index).is_some() {
249            let k: &mut dyn MetaValue = &mut self[index];
250            Some(k)
251        } else {
252            None
253        }
254    }
255
256    fn typename(&self) -> &'static str {
257        if let Some(first) = self.first() {
258            first.typename()
259        } else {
260            ""
261        }
262    }
263
264    fn as_any(&self) -> &dyn Any {
265        self
266    }
267
268    fn flatten(&self) -> Vec<&dyn MetaValue> {
269        self.iter().flat_map(|item| item.flatten()).collect()
270    }
271}
272
273// Used for mutable access which requires setting optional fields.
274impl<T> MetaValue for Option<T>
275where
276    T: MetaValue,
277{
278    fn fields(&self) -> Vec<&'static str> {
279        match self {
280            Some(value) => value.fields(),
281            None => vec![],
282        }
283    }
284
285    fn get_field<'a>(&'a self, field: &str) -> Option<&'a dyn MetaValue> {
286        self.as_ref().and_then(|value| value.get_field(field))
287    }
288
289    fn typename(&self) -> &'static str {
290        match self {
291            Some(value) => value.typename(),
292            None => "",
293        }
294    }
295
296    fn as_any(&self) -> &dyn Any {
297        match self {
298            Some(value) => value.as_any(),
299            None => self,
300        }
301    }
302
303    fn flatten(&self) -> Vec<&dyn MetaValue> {
304        self.as_ref().map(|v| v.flatten()).unwrap_or_else(|| vec![])
305    }
306
307    fn get_index<'a>(&'a self, index: usize) -> Option<&'a dyn MetaValue> {
308        self.as_ref().and_then(|v| v.get_index(index))
309    }
310
311    fn get_field_mut<'a>(&'a mut self, field: &str) -> Option<&'a mut dyn MetaValue> {
312        self.as_mut().and_then(|value| value.get_field_mut(field))
313    }
314
315    fn get_index_mut<'a>(&'a mut self, index: usize) -> Option<&'a mut dyn MetaValue> {
316        self.as_mut().and_then(|v| v.get_index_mut(index))
317    }
318}
319
320impl<T> MetaValue for Box<T>
321where
322    T: MetaValue,
323{
324    fn fields(&self) -> Vec<&'static str> {
325        self.as_ref().fields()
326    }
327
328    fn get_field<'a>(&'a self, field: &str) -> Option<&'a dyn MetaValue> {
329        self.as_ref().get_field(field)
330    }
331
332    fn typename(&self) -> &'static str {
333        self.as_ref().typename()
334    }
335
336    fn as_any(&self) -> &dyn Any {
337        self
338    }
339
340    fn flatten(&self) -> Vec<&dyn MetaValue> {
341        self.as_ref().flatten()
342    }
343
344    fn get_index<'a>(&'a self, index: usize) -> Option<&'a dyn MetaValue> {
345        self.as_ref().get_index(index)
346    }
347
348    fn get_field_mut<'a>(&'a mut self, field: &str) -> Option<&'a mut dyn MetaValue> {
349        self.as_mut().get_field_mut(field)
350    }
351
352    fn get_index_mut<'a>(&'a mut self, index: usize) -> Option<&'a mut dyn MetaValue> {
353        self.as_mut().get_index_mut(index)
354    }
355}