fhir_rs/de/
mod.rs

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
12/// 资源和数据类型的反序列化特性
13/// 所有的资源和数据类型(简单类型和复合类型)都应实现该特性
14pub 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    /// 将一个没有扩展信息的值与一个有扩展信息的值进行合并
108    ///
109    /// ### 参数
110    /// - `master`: 没有扩展信息的数据
111    /// - `slave`:  有扩展信息的值
112    /// ### 返回值
113    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                                    _ => { /* skip */ },
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}