1mod xml_deserializer;
2mod json_deserializer;
3
4use std::marker::PhantomData;
5use std::str::FromStr;
6
7pub use xml_deserializer::from_str as from_xml;
8pub use json_deserializer::from_str as from_json;
9
10use crate::prelude::*;
11
12pub trait Deserialize<'de>: Sized {
15 fn deserialize<De>(deserializer: De) -> Result<Self> where De: Deserializer<'de>;
16}
17
18pub trait Deserializer<'de>: Sized {
19
20 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
21 where
22 V: Visitor<'de>;
23
24 fn deserialize_number<V>(self, visitor: V) -> Result<V::Value>
25 where V: Visitor<'de>;
26
27 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
28 where V: Visitor<'de>;
29
30 fn deserialize_vec<V>(self, visitor: V) -> Result<V::Value>
31 where
32 V: Visitor<'de>;
33
34 fn deserialize_enum<V>(self, visitor: V) -> Result<V::Value>
35 where
36 V: Visitor<'de>;
37
38 fn deserialize_narrative<V>(self, visitor: V) -> Result<V::Value>
39 where
40 V: Visitor<'de>;
41
42 fn deserialize_struct<V>(self, name: &str, visitor: V) -> Result<V::Value>
43 where
44 V: Visitor<'de>;
45
46 fn deserialize_resource<V>(self, name: &str, visitor: V) -> Result<V::Value>
47 where
48 V: Visitor<'de>;
49
50 fn deserialize_primitive<V>(self, _name: &str, visitor: V) -> Result<V::Value>
51 where
52 V: Visitor<'de>;
53}
54
55pub trait MapAccess<'de> {
56
57 fn next_key(&mut self) -> Result<Option<String>>;
58
59 fn next_value<De>(&mut self) -> Result<De> where De: Deserialize<'de>;
60
61 fn next_any_value<De>(&mut self, _key: &str) -> Result<De> where De: Deserialize<'de> {
62 unreachable!()
63 }
64}
65
66pub trait VecAccess<'de> {
67
68 fn next_element<T>(&mut self) -> Result<Option<T>> where T: Deserialize<'de>;
69}
70
71pub trait Visitor<'de>: Sized {
72 type Value;
73 fn visit_str(self, _v: &str) -> Result<Self::Value>{
74 Err(FhirError::un_implementation("visit_str"))
75 }
76
77 fn visit_bool(self, _v: bool) -> Result<Self::Value>{
78 Err(FhirError::un_implementation("visit_bool"))
79 }
80
81 fn visit_map<M>(self, _map: M) -> Result<Self::Value>
82 where
83 M: MapAccess<'de>
84 {
85 Err(FhirError::un_implementation("visit_map"))
86 }
87
88 fn visit_vec<V>(self, _vec: V) -> Result<Self::Value>
89 where
90 V: VecAccess<'de>
91 {
92 Err(FhirError::un_implementation("visit_vec"))
93 }
94
95 fn visit_enum<De>(self, _name: &str, _deserializer: De) -> Result<Self::Value>
96 where De: Deserializer<'de>
97 {
98 Err(FhirError::un_implementation("visit_enum"))
99 }
100
101 fn visit_key<De>(self, _deserializer: &De) -> Result<&'de str>
102 where De: Deserializer<'de>
103 {
104 Err(FhirError::un_implementation("visit_key"))
105 }
106
107 fn with_extension<T>(self, master: Option<T>, slave: Option<T>) -> Option<T>
114 where T: Element
115 {
116 match(master, slave) {
117 (Some(v), None) => {Some(v)}
118 (None, Some(v)) => {Some(v)}
119 (None, None) => {None}
120 (Some(a), Some(b)) => {
121 Some(a.set_id(b.id().clone().unwrap()).set_extensions(b.extensions().unwrap().clone()))
122 }
123 }
124 }
125}
126
127impl<'de, T> Deserialize<'de> for Box<T>
128 where
129 T: Deserialize<'de>,
130{
131 fn deserialize<De>(deserializer: De) -> Result<Self> where De: Deserializer<'de> {
132 Deserialize::deserialize(deserializer).map(Box::new)
133 }
134}
135
136
137impl<'de, T> Deserialize<'de> for Vec<T>
138 where
139 T: Deserialize<'de>,
140{
141 fn deserialize<De>(deserializer: De) -> Result<Self>
142 where De: Deserializer<'de>
143 {
144 let visitor = VecVisitor {
145 marker: PhantomData,
146 };
147 deserializer.deserialize_vec( visitor)
148 }
149}
150pub struct VecVisitor<T> {
151 marker: PhantomData<T>,
152}
153
154impl<'de, T> Visitor<'de> for VecVisitor<T>
155 where
156 T: Deserialize<'de>,
157{
158 type Value = Vec<T>;
159
160 fn visit_vec<V>(self, mut vec: V) -> Result<Self::Value> where V: VecAccess<'de> {
161 let mut values = Vec::<T>::new();
162
163 loop {
164 match vec.next_element() {
165 Ok(Some(value)) => {
166 values.push(value);
167 },
168 Ok(None) => {
169 break
170 }
171 Err(FhirError::EndArrayWhileParsingList) => {
172 break
173 },
174 Err(err) => {
175 return Err(err);
176 }
177 }
178 }
179
180 Ok(values)
181 }
182}
183
184
185impl<'de> Deserialize<'de> for String {
186 fn deserialize<D>(deserializer: D) -> Result<Self>
187 where
188 D: Deserializer<'de>,
189 {
190 struct StringVisitor;
191 impl<'de> Visitor<'de> for StringVisitor {
192 type Value = String;
193
194 fn visit_str(self, v: &str) -> Result<Self::Value>
195 {
196 Ok(v.to_owned())
197 }
198 }
199
200 deserializer.deserialize_str(StringVisitor)
201 }
202}
203
204impl<'de> Deserialize<'de> for bool {
205 fn deserialize<D>(deserializer: D) -> Result<Self> where D: Deserializer<'de> {
206 struct BoolVisitor;
207 impl<'de> Visitor<'de> for BoolVisitor {
208 type Value = bool;
209
210 fn visit_str(self, v: &str) -> Result<Self::Value>
211 {
212 Ok(bool::from_str(v)?)
213 }
214 }
215
216 deserializer.deserialize_str(BoolVisitor)
217 }
218}
219
220impl<'de> Deserialize<'de> for Date {
221 fn deserialize<D>(deserializer: D) -> Result<Self> where D: Deserializer<'de> {
222 struct DateVisitor;
223 impl<'de> Visitor<'de> for DateVisitor {
224 type Value = Date;
225
226 fn visit_str(self, v: &str) -> Result<Self::Value>
227 {
228 Ok(Date::from_str(v)?)
229 }
230 }
231
232 deserializer.deserialize_str(DateVisitor)
233 }
234}
235
236impl<'de> Deserialize<'de> for Time {
237 fn deserialize<D>(deserializer: D) -> Result<Self> where D: Deserializer<'de> {
238 struct TimeVisitor;
239 impl<'de> Visitor<'de> for TimeVisitor {
240 type Value = Time;
241
242 fn visit_str(self, v: &str) -> Result<Self::Value>
243 {
244 Ok(Time::from_str(v)?)
245 }
246 }
247
248 deserializer.deserialize_str(TimeVisitor)
249 }
250}
251
252impl<'de> Deserialize<'de> for DateTime {
253 fn deserialize<D>(deserializer: D) -> Result<Self> where D: Deserializer<'de> {
254 struct DateTimeVisitor;
255 impl<'de> Visitor<'de> for DateTimeVisitor {
256 type Value = DateTime;
257
258 fn visit_str(self, v: &str) -> Result<Self::Value>
259 {
260 Ok(DateTime::from_str(v)?)
261 }
262 }
263
264 deserializer.deserialize_str(DateTimeVisitor)
265 }
266}
267
268impl<'de> Deserialize<'de> for Instant {
269 fn deserialize<D>(deserializer: D) -> Result<Self> where D: Deserializer<'de> {
270 struct InstantVisitor;
271 impl<'de> Visitor<'de> for InstantVisitor {
272 type Value = Instant;
273
274 fn visit_str(self, v: &str) -> Result<Self::Value>
275 {
276 Ok(Instant::from_str(v)?)
277 }
278 }
279
280 deserializer.deserialize_str(InstantVisitor)
281 }
282}
283
284impl<'de> Deserialize<'de> for usize {
285 fn deserialize<D>(deserializer: D) -> Result<Self>
286 where
287 D: Deserializer<'de>,
288 {
289 struct PositiveIntVisitor;
290 impl<'de> Visitor<'de> for PositiveIntVisitor {
291 type Value = PositiveInt;
292
293 fn visit_str(self, v: &str) -> Result<Self::Value>
294 {
295 Ok(PositiveInt::from_str(v)?)
296 }
297 }
298
299 deserializer.deserialize_number(PositiveIntVisitor)
300 }
301}
302
303impl<'de> Deserialize<'de> for isize {
304 fn deserialize<D>(deserializer: D) -> Result<Self>
305 where
306 D: Deserializer<'de>,
307 {
308 struct IntegerVisitor;
309 impl<'de> Visitor<'de> for IntegerVisitor {
310 type Value = Integer;
311
312 fn visit_str(self, v: &str) -> Result<Self::Value>
313 {
314 Ok(Integer::from_str(v)?)
315 }
316 }
317
318 deserializer.deserialize_number(IntegerVisitor)
319 }
320}
321
322impl<'de> Deserialize<'de> for f64 {
323 fn deserialize<D>(deserializer: D) -> Result<Self>
324 where
325 D: Deserializer<'de>,
326 {
327 struct DecimalVisitor;
328 impl<'de> Visitor<'de> for DecimalVisitor {
329 type Value = Decimal;
330
331 fn visit_str(self, v: &str) -> Result<Self::Value>
332 {
333 Ok(Decimal::from_str(v)?)
334 }
335 }
336
337 deserializer.deserialize_number(DecimalVisitor)
338 }
339}
340
341impl<'de> Deserialize<'de> for i64 {
342 fn deserialize<D>(deserializer: D) -> Result<Self>
343 where
344 D: Deserializer<'de>,
345 {
346 struct Integer64Visitor;
347 impl<'de> Visitor<'de> for Integer64Visitor {
348 type Value = Integer64;
349
350 fn visit_str(self, v: &str) -> Result<Self::Value>
351 {
352 Ok(Integer64::from_str(v)?)
353 }
354 }
355
356 deserializer.deserialize_number(Integer64Visitor)
357 }
358}
359
360impl<'de> Deserialize<'de> for AnyType {
361 fn deserialize<De>(deserializer: De) -> Result<Self> where De: Deserializer<'de> {
362
363 pub struct AnyVisitor;
364
365 impl<'de> Visitor<'de> for AnyVisitor {
366 type Value = AnyType;
367
368 fn visit_enum<De>(self, name: &str, _deserializer: De) -> Result<Self::Value>
369 where
370 De: Deserializer<'de>,
371 {
372 println!("Any Type2: {}", name);
373 Ok(AnyType::String(StringDt::new("a")))
374 }
375 }
376
377 deserializer.deserialize_enum(AnyVisitor)
378 }
379}
380
381macro_rules! impl_deserializer_for_primitive {
382 (
383 $(($inner: ident, $ty: ident, $visitor:ident),)+
384 ) => {
385 $(
386 impl<'de> Deserialize<'de> for $ty {
387 fn deserialize<De>(deserializer: De) -> Result<Self> where De: Deserializer<'de> {
388
389 pub struct $visitor;
390 impl<'de> Visitor<'de> for $visitor {
391 type Value = $ty;
392
393 fn visit_str(self, v: &str) -> Result<Self::Value> {
394 $ty::from_str(v)
395 }
396
397 fn visit_map<M>(self, mut mapp: M) -> Result<Self::Value> where M: MapAccess<'de> {
398 let mut id: Option<String> = None;
399 let mut extension: Option<Vec<Extension>> = None;
400 let mut value: Option<$inner> = None;
401
402 while let Some(key) = mapp.next_key()? {
403 match key.as_str() {
404 "id" => id = Some(mapp.next_value()?),
405 "extension" => extension = Some(mapp.next_value()?),
406 "value" => value = Some(mapp.next_value()?),
407 _ => { },
408 }
409 }
410
411 Ok( $ty { id, extension, value } )
412 }
413 }
414
415 deserializer.deserialize_primitive("", $visitor)
416 }
417 }
418 )+
419 };
420}
421
422impl_deserializer_for_primitive!{
423 (String, StringDt, StringDtVisitor),
424 (Id, IdDt, IdDtVisitor),
425 (Base64Binary, Base64BinaryDt, Base64BinaryDtVisitor),
426 (Markdown, MarkdownDt, MarkdownDtVisitor),
427 (Uri, UriDt, UriDtVisitor),
428 (Url, UrlDt, UrlDtVisitor),
429 (Oid, OidDt, OidDtVisitor),
430 (Uuid, UuidDt, UuidDtVisitor),
431 (Canonical, CanonicalDt, CanonicalDtVisitor),
432 (Code, CodeDt, CodeDtVisitor),
433 (Boolean, BooleanDt, BooleanDtVisitor),
434 (DateTime, DateTimeDt, DateTimeDtVisitor),
435 (Date, DateDt, DateDtVisitor),
436 (Time, TimeDt, TimeDtVisitor),
437 (Instant, InstantDt, InstantDtVisitor),
438 (UnsignedInt, UnsignedIntDt, UnsignedIntDtVisitor),
439 (PositiveInt, PositiveIntDt, PositiveIntDtVisitor),
440 (Integer, IntegerDt, IntegerDtVisitor),
441 (Integer64, Integer64Dt, Integer64DtVisitor),
442 (Decimal, DecimalDt, DecimalDtVisitor),
443}