Skip to main content

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    fn is_many(&self) -> bool {
47        false
48    }
49}
50
51impl MetaValue for u64 {
52    fn fields(&self) -> Vec<&'static str> {
53        vec![]
54    }
55
56    fn get_field<'a>(&'a self, _field: &str) -> Option<&'a dyn MetaValue> {
57        None
58    }
59
60    fn get_index<'a>(&'a self, _index: usize) -> Option<&'a dyn MetaValue> {
61        None
62    }
63
64    fn get_field_mut<'a>(&'a mut self, _field: &str) -> Option<&'a mut dyn MetaValue> {
65        None
66    }
67
68    fn get_index_mut<'a>(&'a mut self, _index: usize) -> Option<&'a mut dyn MetaValue> {
69        None
70    }
71
72    fn typename(&self) -> &'static str {
73        "http://hl7.org/fhirpath/System.Integer"
74    }
75
76    fn as_any(&self) -> &dyn Any {
77        self
78    }
79
80    fn flatten(&self) -> Vec<&dyn MetaValue> {
81        vec![self]
82    }
83    fn is_many(&self) -> bool {
84        false
85    }
86}
87
88impl MetaValue for f64 {
89    fn fields(&self) -> Vec<&'static str> {
90        vec![]
91    }
92
93    fn get_field<'a>(&'a self, _field: &str) -> Option<&'a dyn MetaValue> {
94        None
95    }
96
97    fn get_index<'a>(&'a self, _index: usize) -> Option<&'a dyn MetaValue> {
98        None
99    }
100
101    fn get_field_mut<'a>(&'a mut self, _field: &str) -> Option<&'a mut dyn MetaValue> {
102        None
103    }
104
105    fn get_index_mut<'a>(&'a mut self, _index: usize) -> Option<&'a mut dyn MetaValue> {
106        None
107    }
108
109    fn typename(&self) -> &'static str {
110        "http://hl7.org/fhirpath/System.Decimal"
111    }
112
113    fn as_any(&self) -> &dyn Any {
114        self
115    }
116
117    fn flatten(&self) -> Vec<&dyn MetaValue> {
118        vec![self]
119    }
120    fn is_many(&self) -> bool {
121        false
122    }
123}
124
125impl MetaValue for bool {
126    fn fields(&self) -> Vec<&'static str> {
127        vec![]
128    }
129
130    fn get_field<'a>(&'a self, _field: &str) -> Option<&'a dyn MetaValue> {
131        None
132    }
133
134    fn get_index<'a>(&'a self, _index: usize) -> Option<&'a dyn MetaValue> {
135        None
136    }
137
138    fn get_field_mut<'a>(&'a mut self, _field: &str) -> Option<&'a mut dyn MetaValue> {
139        None
140    }
141
142    fn get_index_mut<'a>(&'a mut self, _index: usize) -> Option<&'a mut dyn MetaValue> {
143        None
144    }
145
146    fn typename(&self) -> &'static str {
147        "http://hl7.org/fhirpath/System.Boolean"
148    }
149
150    fn as_any(&self) -> &dyn Any {
151        self
152    }
153
154    fn flatten(&self) -> Vec<&dyn MetaValue> {
155        vec![self]
156    }
157    fn is_many(&self) -> bool {
158        false
159    }
160}
161
162impl MetaValue for String {
163    fn fields(&self) -> Vec<&'static str> {
164        vec![]
165    }
166
167    fn get_field<'a>(&'a self, _field: &str) -> Option<&'a dyn MetaValue> {
168        None
169    }
170
171    fn get_index<'a>(&'a self, _index: usize) -> Option<&'a dyn MetaValue> {
172        None
173    }
174
175    fn get_field_mut<'a>(&'a mut self, _field: &str) -> Option<&'a mut dyn MetaValue> {
176        None
177    }
178
179    fn get_index_mut<'a>(&'a mut self, _index: usize) -> Option<&'a mut dyn MetaValue> {
180        None
181    }
182
183    fn typename(&self) -> &'static str {
184        "http://hl7.org/fhirpath/System.String"
185    }
186
187    fn as_any(&self) -> &dyn Any {
188        self
189    }
190
191    fn flatten(&self) -> Vec<&dyn MetaValue> {
192        vec![self]
193    }
194    fn is_many(&self) -> bool {
195        false
196    }
197}
198
199impl MetaValue for &'static str {
200    fn fields(&self) -> Vec<&'static str> {
201        vec![]
202    }
203
204    fn get_field<'a>(&'a self, _field: &str) -> Option<&'a dyn MetaValue> {
205        None
206    }
207
208    fn get_index<'a>(&'a self, _index: usize) -> Option<&'a dyn MetaValue> {
209        None
210    }
211
212    fn get_field_mut<'a>(&'a mut self, _field: &str) -> Option<&'a mut dyn MetaValue> {
213        None
214    }
215
216    fn get_index_mut<'a>(&'a mut self, _index: usize) -> Option<&'a mut dyn MetaValue> {
217        None
218    }
219
220    fn typename(&self) -> &'static str {
221        "http://hl7.org/fhirpath/System.String"
222    }
223
224    fn as_any(&self) -> &dyn Any {
225        self
226    }
227
228    fn flatten(&self) -> Vec<&dyn MetaValue> {
229        vec![self]
230    }
231
232    fn is_many(&self) -> bool {
233        false
234    }
235}
236
237impl<T> MetaValue for Vec<T>
238where
239    T: MetaValue,
240{
241    fn fields(&self) -> Vec<&'static str> {
242        if let Some(first) = self.first() {
243            first.fields()
244        } else {
245            vec![]
246        }
247    }
248
249    fn get_field<'a>(&'a self, _field: &str) -> Option<&'a dyn MetaValue> {
250        None
251    }
252
253    fn get_index<'a>(&'a self, index: usize) -> Option<&'a dyn MetaValue> {
254        if self.get(index).is_some() {
255            let k: &dyn MetaValue = &self[index];
256            Some(k)
257        } else {
258            None
259        }
260    }
261
262    fn get_field_mut<'a>(&'a mut self, _field: &str) -> Option<&'a mut dyn MetaValue> {
263        None
264    }
265
266    fn get_index_mut<'a>(&'a mut self, index: usize) -> Option<&'a mut dyn MetaValue> {
267        if self.get(index).is_some() {
268            let k: &mut dyn MetaValue = &mut self[index];
269            Some(k)
270        } else {
271            None
272        }
273    }
274
275    fn typename(&self) -> &'static str {
276        if let Some(first) = self.first() {
277            first.typename()
278        } else {
279            ""
280        }
281    }
282
283    fn as_any(&self) -> &dyn Any {
284        self
285    }
286
287    fn flatten(&self) -> Vec<&dyn MetaValue> {
288        self.iter().flat_map(|item| item.flatten()).collect()
289    }
290
291    fn is_many(&self) -> bool {
292        true
293    }
294}
295
296// Used for mutable access which requires setting optional fields.
297impl<T> MetaValue for Option<T>
298where
299    T: MetaValue,
300{
301    fn fields(&self) -> Vec<&'static str> {
302        match self {
303            Some(value) => value.fields(),
304            None => vec![],
305        }
306    }
307
308    fn get_field<'a>(&'a self, field: &str) -> Option<&'a dyn MetaValue> {
309        self.as_ref().and_then(|value| value.get_field(field))
310    }
311
312    fn typename(&self) -> &'static str {
313        match self {
314            Some(value) => value.typename(),
315            None => "",
316        }
317    }
318
319    fn as_any(&self) -> &dyn Any {
320        match self {
321            Some(value) => value.as_any(),
322            None => self,
323        }
324    }
325
326    fn flatten(&self) -> Vec<&dyn MetaValue> {
327        self.as_ref().map(|v| v.flatten()).unwrap_or_else(|| vec![])
328    }
329
330    fn get_index<'a>(&'a self, index: usize) -> Option<&'a dyn MetaValue> {
331        self.as_ref().and_then(|v| v.get_index(index))
332    }
333
334    fn get_field_mut<'a>(&'a mut self, field: &str) -> Option<&'a mut dyn MetaValue> {
335        self.as_mut().and_then(|value| value.get_field_mut(field))
336    }
337
338    fn get_index_mut<'a>(&'a mut self, index: usize) -> Option<&'a mut dyn MetaValue> {
339        self.as_mut().and_then(|v| v.get_index_mut(index))
340    }
341
342    fn is_many(&self) -> bool {
343        self.as_ref().map(|v| v.is_many()).unwrap_or(false)
344    }
345}
346
347impl<T> MetaValue for Box<T>
348where
349    T: MetaValue,
350{
351    fn fields(&self) -> Vec<&'static str> {
352        self.as_ref().fields()
353    }
354
355    fn get_field<'a>(&'a self, field: &str) -> Option<&'a dyn MetaValue> {
356        self.as_ref().get_field(field)
357    }
358
359    fn typename(&self) -> &'static str {
360        self.as_ref().typename()
361    }
362
363    fn as_any(&self) -> &dyn Any {
364        self
365    }
366
367    fn flatten(&self) -> Vec<&dyn MetaValue> {
368        self.as_ref().flatten()
369    }
370
371    fn get_index<'a>(&'a self, index: usize) -> Option<&'a dyn MetaValue> {
372        self.as_ref().get_index(index)
373    }
374
375    fn get_field_mut<'a>(&'a mut self, field: &str) -> Option<&'a mut dyn MetaValue> {
376        self.as_mut().get_field_mut(field)
377    }
378
379    fn get_index_mut<'a>(&'a mut self, index: usize) -> Option<&'a mut dyn MetaValue> {
380        self.as_mut().get_index_mut(index)
381    }
382    fn is_many(&self) -> bool {
383        self.as_ref().is_many()
384    }
385}