1mod 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
21pub trait Serialize {
23 fn serialize<Ser: Serializer>(&self, serializer: Ser) -> Result<()>;
24}
25
26pub 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 fn serialize_xhtml(self, value: &Xhtml) -> Result<()>;
41 fn serialize_bool(self, value: bool) -> Result<()>;
45
46 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}