fhir_rs/ser/
mod.rs

1//! FHIR资源的序列化解析器
2//!
3//! 序列化解析器的作用是将FHIR资源转换为指定格式的字符串
4//!
5//! 目前提供了两种格式的序列化解析器
6//! * XML格式
7//! * JSON格式
8//!
9//!
10
11mod json_serializer;
12mod xml_serializer;
13
14pub use json_serializer::to_string as to_json;
15pub use json_serializer::to_string_pretty as to_json_pretty;
16pub use xml_serializer::to_string as to_xml;
17pub use xml_serializer::to_string_pretty as to_xml_pretty;
18
19use crate::prelude::*;
20
21/// 实现该特性的数据结构体能够被序列化到指定类型的字符串
22pub trait Serialize {
23    fn serialize<Ser: Serializer>(&self, serializer: Ser) -> Result<()>;
24}
25
26/// 能够将资源序列化到指定格式字符串的解析器
27pub trait Serializer: Sized {
28    type SerializeResource: SerializeResource;
29    type SerializePrimitive: SerializePrimitive;
30    type SerializeStruct: SerializeStruct;
31    type SerializeExtension: SerializeExtension;
32    type SerializeNarrative: SerializeNarrative;
33    type SerializeVec: SerializeVec;
34
35    fn serialize_any<T: Serialize>(self, type_name: &str, value: &T) -> Result<()>;
36    fn serialize_str(self, value: &str) -> Result<()>;
37    fn serialize_string(self, value: String) -> Result<()>;
38
39    /// 序列化一个复合XHTML规则的字符串
40    fn serialize_xhtml(self, value: &Xhtml) -> Result<()>;
41    /// 序列化一个布尔值
42    ///
43    /// Serialize a `bool` value
44    fn serialize_bool(self, value: bool) -> Result<()>;
45
46    /// 序列化一个正整数值
47    ///
48    /// Serialize an `positiveInt` value.
49    ///
50    /// 对应FHIR规范定义的positiveInt类型(1..2,147,483,647)
51    ///
52    /// positiveInt: Any positive integer in the range 1..2,147,483,647
53    fn serialize_number(self, value: usize) -> Result<()>;
54    fn serialize_integer(self, value: isize) -> Result<()>;
55    fn serialize_integer64(self, value: i64) -> Result<()>;
56    fn serialize_decimal(self, value: f64) -> Result<()>;
57    fn serialize_none(self) -> Result<()>;
58    fn serialize_primitive(self) -> Result<Self::SerializePrimitive>;
59    fn serialize_vec(self, len: Option<usize>) -> Result<Self::SerializeVec>;
60    fn serialize_resource(self, name: &'static str) -> Result<Self::SerializeResource>;
61    fn serialize_struct(self, name: &'static str) -> Result<Self::SerializeStruct>;
62    fn serialize_extension(self) -> Result<Self::SerializeExtension>;
63    fn serialize_narrative(self) -> Result<Self::SerializeNarrative>;
64}
65
66pub trait SerializeResource {
67    fn serialize_id(&mut self, value: &Option<Id>) -> Result<()>;
68    fn serialize_field<T: Serialize>(&mut self, name: &'static str, value: &T) -> Result<()>;
69    fn serialize_end(self) -> Result<()>;
70}
71
72pub trait SerializeStruct {
73    fn serialize_id(&mut self, value: &Option<String>) -> Result<()>;
74    fn serialize_extension(&mut self, value: &Option<Vec<Extension>>) -> Result<()>;
75    fn serialize_field<T: Serialize>(&mut self, name: &'static str, value: &T) -> Result<()>;
76
77    fn serialize_end(self) -> Result<()>;
78}
79
80pub trait SerializeVec {
81    fn serialize_element<T: Serialize>(&mut self, value: &T) -> Result<()>;
82    fn serialize_end(self) -> Result<()>;
83}
84
85pub trait SerializePrimitive {
86    fn serialize_id(&mut self, value: &Option<String>) -> Result<()>;
87    fn serialize_extension(&mut self, value: &Option<Vec<Extension>>) -> Result<()>;
88    fn serialize_value<T: Serialize>(&mut self, value: &Option<T>) -> Result<()>;
89    fn serialize_end(self) -> Result<()>;
90}
91
92pub trait SerializeNarrative {
93    fn serialize_id(&mut self, value: &Option<String>) -> Result<()>;
94    fn serialize_xhtml<T: Serialize>(&mut self, value: &Option<T>) -> Result<()>;
95    fn serialize_end(self) -> Result<()>;
96}
97
98pub trait SerializeExtension {
99    fn serialize_id(&mut self, value: &Option<String>) -> Result<()>;
100    fn serialize_extension(&mut self, value: &Option<Vec<Extension>>) -> Result<()>;
101    fn serialize_url(&mut self, value: &Option<String>) -> Result<()>;
102    fn serialize_value<T: Serialize>(&mut self, value: &T) -> Result<()>;
103    fn serialize_end(self) -> Result<()>;
104}
105
106impl Serialize for String {
107    fn serialize<Ser: Serializer>(&self, serializer: Ser) -> Result<()> {
108        serializer.serialize_str(self)
109    }
110}
111
112impl Serialize for Xhtml {
113    fn serialize<Ser: Serializer>(&self, serializer: Ser) -> Result<()> {
114        serializer.serialize_xhtml(&self)
115    }
116}
117
118impl Serialize for Boolean {
119    fn serialize<Ser: Serializer>(&self, serializer: Ser) -> Result<()> {
120        serializer.serialize_bool(*self)
121    }
122}
123
124impl Serialize for usize {
125    fn serialize<Ser: Serializer>(&self, serializer: Ser) -> Result<()> {
126        serializer.serialize_number(*self)
127    }
128}
129
130impl Serialize for isize {
131    fn serialize<Ser: Serializer>(&self, serializer: Ser) -> Result<()> {
132        serializer.serialize_integer(*self)
133    }
134}
135
136impl Serialize for f64 {
137    fn serialize<Ser: Serializer>(&self, serializer: Ser) -> Result<()> {
138        serializer.serialize_decimal(*self)
139    }
140}
141
142impl Serialize for i64 {
143    fn serialize<Ser: Serializer>(&self, serializer: Ser) -> Result<()> {
144        serializer.serialize_integer64(*self)
145    }
146}
147
148impl Serialize for Date {
149    fn serialize<Ser: Serializer>(&self, serializer: Ser) -> Result<()> {
150        serializer.serialize_string(self.to_string())
151    }
152}
153
154impl Serialize for Time {
155    fn serialize<Ser: Serializer>(&self, serializer: Ser) -> Result<()> {
156        serializer.serialize_string(self.to_string())
157    }
158}
159
160impl Serialize for DateTime {
161    fn serialize<Ser: Serializer>(&self, serializer: Ser) -> Result<()> {
162        serializer.serialize_string(self.to_string())
163    }
164}
165
166impl Serialize for Instant {
167    fn serialize<Ser: Serializer>(&self, serializer: Ser) -> Result<()> {
168        serializer.serialize_string(self.to_string())
169    }
170}
171
172impl<T: Serialize> Serialize for Vec<T> {
173    #[inline]
174    fn serialize<Ser: Serializer>(&self, serializer: Ser)-> Result<()> {
175        tracing::debug!("开始处理数组");
176
177        let iter = self.into_iter();
178        let mut vec = serializer.serialize_vec(Some(self.len()))?;
179        for item in iter {
180            vec.serialize_element(item)?;
181        }
182        vec.serialize_end()
183    }
184}
185
186impl<T: Serialize> Serialize for Option<T> {
187    fn serialize<Ser>(&self, serializer: Ser) -> Result<()> where Ser: Serializer {
188        match self {
189            Some(value) => {
190                value.serialize(serializer)
191            },
192            None => {
193                serializer.serialize_none()?;
194                Ok(())
195            },
196        }
197    }
198}
199
200impl<T: Serialize> Serialize for Box<T> {
201    fn serialize<Ser>(&self, serializer: Ser) -> Result<()> where Ser: Serializer {
202        (**self).serialize(serializer)
203    }
204}
205
206
207macro_rules! impl_serialize_for_primitive {
208    (
209        $($ty: ident, )+
210    ) => {
211        $(
212            impl Serialize for $ty {
213                fn serialize<Ser: Serializer>(&self, serializer: Ser) -> Result<()> {
214                    let mut primitive  = serializer.serialize_primitive()?;
215                    primitive.serialize_id(&self.id)?;
216                    primitive.serialize_value(&self.value)?;
217                    primitive.serialize_extension(&self.extension)?;
218                    primitive.serialize_end()
219                }
220            }
221        )+
222    };
223}
224
225impl_serialize_for_primitive!{
226    StringDt,
227    IdDt,
228    Base64BinaryDt,
229    MarkdownDt,
230    UriDt,
231    UrlDt,
232    OidDt,
233    UuidDt,
234    CanonicalDt,
235    CodeDt,
236    BooleanDt,
237    DateTimeDt,
238    DateDt,
239    TimeDt,
240    InstantDt,
241    UnsignedIntDt,
242    PositiveIntDt,
243    IntegerDt,
244    Integer64Dt,
245    DecimalDt,
246}
247
248macro_rules! impl_serialize_for_anytype {
249    (
250        $($id: ident,)+
251    ) => {
252        impl Serialize for AnyType {
253            fn serialize<Ser>(&self, serializer: Ser) -> Result<()> where Ser: Serializer {
254                match self {
255                    $(AnyType::$id(value) => serializer.serialize_any(stringify!($id), value),)+
256                }
257            }
258        }
259    };
260}
261
262impl_serialize_for_anytype!{
263    String,
264    Id,
265    Base64Binary,
266    Markdown,
267    Uri,
268    Url,
269    Oid,
270    Uuid,
271    Canonical,
272    Code,
273    Boolean,
274    DateTime,
275    Date,
276    Time,
277    Instant,
278    UnsignedInt,
279    PositiveInt,
280    Integer,
281    Integer64,
282    Decimal,
283    Address,
284    Age,
285    Annotation,
286    Attachment,
287    CodeableConcept,
288    CodeableReference,
289    Coding,
290    ContactPoint,
291    Count,
292    Distance,
293    Duration,
294    HumanName,
295    Identifier,
296    Money,
297    Period,
298    Quantity,
299    Range,
300    Ratio,
301    RatioRange,
302    Reference,
303    SampledData,
304    Signature,
305    Timing,
306    ContactDetail,
307    DataRequirement,
308    Expression,
309    ParameterDefinition,
310    RelatedArtifact,
311    TriggerDefinition,
312    UsageContext,
313    Availability,
314    ExtendedContactDetail,
315    Dosage,
316    Meta,
317}